Quartz:Quartz定时代码实现
1.添加pom.xml
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz-jobs -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.3</version>
</dependency>
2.添加配置文件,或者不添加使用默认也行,默认线程池数量为10
打开quartz的jar包,可以找到该配置 quartz.properties
复制到资源目录下修改如下
org.quartz.scheduler.instanceName: DemoQuartz
org.quartz.scheduler.rmi.export: false
org.quartz.scheduler.rmi.proxy: false
org.quartz.scheduler.wrapJobExecutionInUserTransaction: false org.quartz.threadPool.class: org.quartz.simpl.SimpleThreadPool
#线程池数量
org.quartz.threadPool.threadCount: 1
org.quartz.threadPool.threadPriority: 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: true org.quartz.jobStore.misfireThreshold: 60000 org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore
3.编写job类
DemoJob.class,HelloJob.class
实现接口 org.quartz.Job
package com.yun.base.job; import java.util.Calendar; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SchedulerException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class HelloJob implements Job { private static final Logger LOGGER = LoggerFactory.getLogger(HelloJob.class); @Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
try {
LOGGER.info(context.getScheduler().getSchedulerName());
String jobParam = (String) context.getJobDetail().getJobDataMap().get("jobParam");
if (jobParam != null) {
LOGGER.info(jobParam.toString());
}
LOGGER.info(Integer.toString(Calendar.getInstance().get(Calendar.SECOND)));
} catch (SchedulerException e) {
e.printStackTrace();
}
} }
4.编写任务管理工具类 JobSchedule
package com.yun.util; import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class JobSchedule { private static final Logger LOGGER = LoggerFactory.getLogger(JobSchedule.class); private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();
private static String JOB_GROUP_NAME = "YUN_JOBGROUP_NAME";
private static String TRIGGER_GROUP_NAME = "YUN_TRIGGERGROUP_NAME"; private JobSchedule(){ } /**
* @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名
*
* @param jobName
* 任务名
* @param cls
* 任务
* @param cron
* 时间设置,参考quartz说明文档
* @throws SchedulerException
*
*/
public static void addJob(String jobName, Class cls, String cron)
throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler(); // 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(cls)
.withIdentity(jobName, JOB_GROUP_NAME).build(); // 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(jobName, TRIGGER_GROUP_NAME)// 给触发器起一个名字和组名
.startNow()// 立即执行
.withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 触发器的执行时间
.build();// 产生触发器 sched.scheduleJob(jobDetail, trigger);
LOGGER.debug("添加任务:{},{},{}",jobName,cls,cron);
// 启动
if (!sched.isShutdown()) {
sched.start();
}
} /**
* @Description: 添加一个定时任务
*
* @param jobName
* 任务名
* @param jobGroupName
* 任务组名
* @param triggerName
* 触发器名
* @param triggerGroupName
* 触发器组名
* @param jobClass
* 任务
* @param cron
* 时间设置,参考quartz说明文档
*/
public static void addJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName, Class cls, String cron)
throws SchedulerException { Scheduler sched = gSchedulerFactory.getScheduler();
// 用于描叙Job实现类及其他的一些静态信息,构建一个作业实例
JobDetail jobDetail = JobBuilder.newJob(cls)
.withIdentity(jobName, jobGroupName).build(); // 构建一个触发器,规定触发的规则
Trigger trigger = TriggerBuilder.newTrigger()// 创建一个新的TriggerBuilder来规范一个触发器
.withIdentity(jobName, triggerGroupName)// 给触发器起一个名字和组名
.startNow()// 立即执行
.withSchedule(CronScheduleBuilder.cronSchedule(cron)) // 触发器的执行时间
.build();// 产生触发器 sched.scheduleJob(jobDetail, trigger);
LOGGER.debug("添加任务:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName,cls,cron);
// 启动
if (!sched.isShutdown()) {
sched.start();
} } /**
* @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
* @param cron
* @throws SchedulerException
*
*/
public static void modifyJobTime(String jobName, String cron) throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
TriggerKey triggerKey = new TriggerKey(jobName, TRIGGER_GROUP_NAME);
CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerKey);
if (trigger == null) {
return;
}
String oldTime = trigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)) {
JobDetail jobDetail = sched.getJobDetail(new JobKey(jobName,
JOB_GROUP_NAME));
Class objJobClass = jobDetail.getJobClass();
removeJob(jobName);
addJob(jobName, objJobClass, cron);
LOGGER.debug("修改任务:{},{}",jobName,cron);
}
} /**
* @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名)
*
* @param jobName
*
* @throws SchedulerException
*/
public static void removeJob(String jobName) throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler(); JobKey jobKey = new JobKey(jobName, TRIGGER_GROUP_NAME);
// 停止触发器
sched.pauseJob(jobKey);
sched.unscheduleJob(new TriggerKey(jobName, TRIGGER_GROUP_NAME));// 移除触发器
sched.deleteJob(jobKey);// 删除任务
LOGGER.debug("移除任务:{}",jobName);
} /**
* 移除任务
*
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
* @throws SchedulerException
*/
public static void removeJob(String jobName, String jobGroupName,
String triggerName, String triggerGroupName)
throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
JobKey jobKey = new JobKey(jobName, jobGroupName);
// 停止触发器
sched.pauseJob(jobKey);
sched.unscheduleJob(new TriggerKey(jobName, triggerGroupName));// 移除触发器
sched.deleteJob(jobKey);// 删除任务
LOGGER.debug("移除任务:{},{},{},{},{},{}",jobName,jobGroupName,triggerName,triggerGroupName);
} /**
* 启动所有任务
*
* @throws SchedulerException
*/
public static void startJobs() throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
sched.start();
LOGGER.debug("启动所有任务");
} /**
* 关闭所有定时任务
*
* @throws SchedulerException
*
*/
public static void shutdownJobs() throws SchedulerException {
Scheduler sched = gSchedulerFactory.getScheduler();
if (!sched.isShutdown()) {
sched.shutdown();
LOGGER.debug("关闭所有任务");
}
} }
5.测试类
@Test
public void testTask() {
try {
String job_name = "动态任务调度";
System.out.println("【系统启动】开始(每1秒输出一次)...");
JobSchedule.addJob(job_name, DemoJob.class, "0/1 * * * * ?"); Thread.sleep(5000);
System.out.println("【修改时间】开始(每2秒输出一次)...");
JobSchedule.modifyJobTime(job_name, "10/2 * * * * ?");
Thread.sleep(6000);
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功"); System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");
JobSchedule.addJob(job_name, HelloJob.class, "*/10 * * * * ?");
Thread.sleep(60000);
System.out.println("【移除定时】开始...");
JobSchedule.removeJob(job_name);
System.out.println("【移除定时】成功");
} catch (Exception e) {
e.printStackTrace();
}
}
测试结果
【系统启动】开始(每1秒输出一次)...
2017-07-20 18:11:03.026 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.DemoJob,0/1 * * * * ?
2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:03.042 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 3
2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:04.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 4
2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:05.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 5
2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:06.008 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 6
2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:07.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 7
2017-07-20 18:11:08.012 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:08.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 8
【修改时间】开始(每2秒输出一次)...
2017-07-20 18:11:08.043 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.DemoJob,10/2 * * * * ?
2017-07-20 18:11:08.047 [main] DEBUG com.yun.util.JobSchedule - 修改任务:动态任务调度,10/2 * * * * ?
2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:10.001 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 10
2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:12.013 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 12
2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - DemoQuartz
2017-07-20 18:11:14.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.DemoJob - 14
【移除定时】开始...
2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
【移除定时】成功
【再次添加定时任务】开始(每10秒输出一次)...
2017-07-20 18:11:14.054 [main] DEBUG com.yun.util.JobSchedule - 添加任务:动态任务调度,class com.yun.base.job.HelloJob,*/10 * * * * ?
2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:20.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 20
2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:30.006 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 30
2017-07-20 18:11:40.004 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:40.005 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 40
2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:11:50.007 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 50
2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:12:00.010 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 0
2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - DemoQuartz
2017-07-20 18:12:10.000 [DemoQuartz_Worker-1] INFO com.yun.base.job.HelloJob - 10
【移除定时】开始...
2017-07-20 18:12:14.060 [main] DEBUG com.yun.util.JobSchedule - 移除任务:动态任务调度
【移除定时】成功
文章转载至:https://www.cnblogs.com/yun965861480/p/7211327.html?utm_source=itdadao&utm_medium=referral
Quartz:Quartz定时代码实现的更多相关文章
- C#使用quartz.net定时问题
因工作需要需要完成定时查询数据..因此在了解之后完成了一个demo 所需要的dll在该地址下载 http://pan.baidu.com/s/1sjNQLXV 首先引入quartz这个dll... 在 ...
- 用abp vNext快速开发Quartz.NET定时任务管理界面
今天这篇文章我将通过实例代码带着大家一步一步通过abp vNext这个asp.net core的快速开发框架来进行Quartz.net定时任务调度的管理界面的开发.大伙最好跟着一起敲一下代码,当然源码 ...
- spring和Quartz的定时功能
一:前沿 最近在做一个定时的功能,就是在一定时间内查询订单,然后告诉用户未付款,已付款等消息通知,而且要做集群的功能,这个集群的功能是指,我部署两套代码,其中一个定时的功能在运行,另外一个就不要运行. ...
- Hosted Services+Quartz实现定时任务调度
背景 之前.net core使用quartz.net时,总感觉非常变扭,百度和谷歌了N久都没解决以下问题,造成代码丑陋,非常不优雅: 1.项目启动时,要立刻恢复执行quartz.net中的任务 2.q ...
- 【10】Quartz.net 定时服务实例
一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...
- spring结合quartz的定时的2种方式
1. Spring 的org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean类,使用此方法使开发人员对Quar ...
- 用Quartz处理定时执行的任务
这次做的项目中,有一部分功能需要实现定时执行.呃,这样说可能有点笼统,打个比方吧.例如用户在登录的时候,连续输错3次密码后,系统会将该用户冻结,不再允许该用户登录系统,等到了晚上零晨时分,再为所有被冻 ...
- Quartz.net 定时任务在IIS中未按时执行
IIS 垃圾回收机制下解决Quartz.net 的不执行问题 IIS中涉及了垃圾回收机制,quartz.net 在ASP.NET 项目中可以实现线程监控定时执行任务,但是在IIS7.5机一下版本中涉及 ...
- quartz实现定时功能实例详解(servlet定时器配置方法)
Quartz是一个完全由java编写的开源作业调度框架,下面提供一个小例子供大家参考,还有在servlet配置的方法 Quartz是一个完全由java编写的开源作业调度框架,具体的介绍可到http:/ ...
随机推荐
- 西门子 S7200 以太网模块连接力控组态方法
产品简介:北京华科远创科技有限研发的远创智控ETH-YC模块,以太网通讯模块型号有MPI-ETH-YC01和PPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART ...
- supervisor 使 celery后台运行
1.安装 supervisor pip install supervisor 2.创建supervisor配置文件,命令如下: 进入项目文件 echo_supervisord_conf > s ...
- 3D深度估计
3D深度估计 Consistent Video Depth Estimation 论文地址:https://arxiv.org/pdf/2004.15021.pdf 项目网站:https://roxa ...
- XLearning - 深度学习调度平台
XLearning - 深度学习调度平台 软件简介 XLearning **** 是奇虎 360 开源的一款支持多种机器学习.深度学习框架调度系统.基于 Hadoop Yarn 完成了对TensorF ...
- NVIDIA Nsight Systems CUDA 跟踪
NVIDIA Nsight Systems CUDA 跟踪 CUDA跟踪 NVIDIA Nsight Systems能够捕获有关在概要过程中执行CUDA的信息. 可以在报告的时间轴上收集和呈现以下信息 ...
- 【NX二次开发】Block UI 分割线
设置控件可见 this->separator0->GetProperties()->SetLogical("Show",true);
- 【NX二次开发】创建有界平面UF_MODL_create_bplane
先准备几条曲线如下图所示,我们用这几条线来创建一个有界平面: 效果: 源码: //有界平面 extern DllExport void ufusr(char *param, int *returnC ...
- 树莓派写入openwrt作为路由器
需要:树莓派4B,SD卡一张,SD卡读卡器一枚,openwrt镜像一份. 环境: Linux(deepin 20). 将SD卡插入读卡器,读卡器再插入电脑. 首先查看SD卡: sudo fdisk - ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- Redis源码解析之跳跃表(三)
我们再来学习如何从跳跃表中查询数据,跳跃表本质上是一个链表,但它允许我们像数组一样定位某个索引区间内的节点,并且与数组不同的是,跳跃表允许我们将头节点L0层的前驱节点(即跳跃表分值最小的节点)zsl- ...