课时八十五、 Spring Boot 2.0 quartz:任务动态管理-添加
在前面我们讲到了任务的持久化了,但是在实际项目中,我们的PD还是会提出更高的需求
一、需求分析
那么任务动态管理都包括哪些呢?
(1)动态添加任务:在应用程序运行的过程中,动态的添加一个定时任务(无需重启应用)
(2)动态删除任务:在应用程序运行的过程中,动态的删除一个定时任务
(3)动态修改任务:在应用程序运行的过程中,动态的修改一个定时任务,这里的修改主要是修改定时任务的时间
(4)动态关闭所有任务:在应用程序运行的过程中,动态的关闭所有定时任务,也就是当前正在运行的定时任务统统停掉
(5)动态启动所有任务:在应用程序运行的过程中,动态的启动所有定时任务,也就是把所有暂停的定时任务都启动起来
二、编码思路
(1)触发器如何构建:使用TriggerBuilder就可以构建触发器
(2)任务如何定义:使用JobBuilder就可以定义job
(3)定时任务谁管理:这是由定时任务调度器Scheduler进行管理的
(4)定时任务调度器谁管理:由于这里我们使用了Spring集成了Quartz,所以这里的Scheduler是由SchedulerFactoryBean进行管理的
三、代码实现
/**
* 动态添加任务.
* @param jobName : 任务的名称;
* @param jobGroupName 任务的组名称;
* @param triggerName : 触发器名称
* @param triggerGroupName : 触发器组名称
* @param jobClass : job实现类.
* @param cronExpression : 定时任务表达式
* @return date -- 此定时任务第一次触发的时间.
*/public Date addJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName,Class jobClass,String cronExpression) {
/*
* 1/ 需要获取到任务调度器Scheduler
* 2/定义jobDetail;
* 3/定义trigger;
* 4/使用Scheduler添加任务;
*/
//* 1/ 需要获取到任务调度器Scheduler
Scheduler scheduler = schedulerFactoryBean.getScheduler();
// * 2/定义jobDetail;
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(jobName, jobGroupName).build();
// * 3/定义trigger;
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroupName).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
// * 4/使用Scheduler添加任务;
try {
return scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
return null;
}
}
课时八十六、Spring Boot 2.0 quartz:任务动态管理-删除
在前面一节介绍了动态任务的添加,这节讲讲动态任务的删除。
编码思路
1、获取到任务调度器
2、停止并且移除触发器
3、删除任务
代码片段
1、停止触发器
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
scheduled.pauseTrigger(triggerKey);
2、移除触发器
scheduled.unscheduleJob(triggerKey);
3、删除任务
JobKey jobKey = JobKey.jobKey(jobName, jobGroupName);
代码实现
/**
* 定时任务删除
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*/
public void deleteJob(String jobName,String jobGroupName,String triggerName,String triggerGroupName) {
/*
1/ 获取到定时任务调度器.
2/ 停止触发器.
3/删除触发器.
4/删除任务.
*/
// 1/ 获取到定时任务调度器.
Scheduler scheduler = schedulerFactoryBean.getScheduler();
try {
// 2/ 停止触发器.
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
scheduler.pauseTrigger(triggerKey);
// 3/删除触发器.
scheduler.unscheduleJob(triggerKey);
// 4/删除任务.
JobKey jobKey = JobKey.jobKey(jobName,jobGroupName);
scheduler.deleteJob(jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
课时八十七、Spring Boot 2.0 quartz:任务动态管理-修改
1、前言
在前面小节介绍了如何删除,那么有时间,我们并不是要删除,而是觉得定时的时间不对,所以要进行修改下定时时间
2、实现方式
删除&添加
先删除任务,在添加一个任务,这种方式是最简单的:
deleteJob()
addJob()
使用rescheduleJob
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
try {
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
if(trigger == null) {
return null;
}
String oldCronExpression = trigger.getCronExpression();
if(oldCronExpression.equals(cronExpression)) {
return null;
}else {
trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
return scheduler.rescheduleJob(triggerKey, trigger);
}
} catch (SchedulerException e) {
e.printStackTrace();
return null;
}
3、代码实现
删除&添加
/**
* 修改定时任务的时间.
* @param jobName
* @param jobGroupName
* @param triggerName
* @param triggerGroupName
*/
public void modifyJobTime(String jobName,String jobGroupName,String triggerName,String triggerGroupName,String cronExpression) {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
/*
* 第一种方式: 删除&添加
* 在删除之前就需要先获取到JobDetail,否者就无法获取了.
*/
/*try {
JobDetail jobDetail = scheduler.getJobDetail(JobKey.jobKey(jobName, jobGroupName));
deleteJob(jobName, jobGroupName, triggerName, triggerGroupName);
addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobDetail.getJobClass(), cronExpression);
} catch (SchedulerException e) {
e.printStackTrace();
}*/}
使用rescheduleJob
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName,triggerGroupName);
try {
CronTrigger trigger = (CronTrigger)scheduler.getTrigger(triggerKey);
String oldCronExpression = trigger.getCronExpression();
if(oldCronExpression.equals(cronExpression)) {
return;
}
trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(cronExpression)).build();
scheduler.rescheduleJob(triggerKey, trigger);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
课时八十八、Spring Boot 2.0 quartz:任务动态管理-启动停止所有任务
在前面一节介绍了动态任务修改时间,这节讲讲如何停止和启动所有的定时任务。
1、编码实现
这里会有三个方法:startJobs、shutdownJobs、standby,先看下具体的代码实现:
2、startJobs
/**
* 启动所有的定时任务.
* 这个是配合standby一起使用的,
* 当job处于standby模式的时候,调用startJobs可以恢复定时任务.
*/
public void startJobs() {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
try {
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
3、shutdownJobs
/**
* 关闭所有的定时任务.
* 注意:一旦被shutdown之后,就不能调用startJobs.
*/
public void shutdownJobs() {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
try {
if(!scheduler.isShutdown()) {
scheduler.shutdown();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
4、standby
/**
* 将定时任务设置为待机或者备用状态,暂停的模式.
* 可以使用start进行恢复.
*/
public void standby() {
Scheduler scheduler = schedulerFactoryBean.getScheduler();
try {
scheduler.standby();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
参考代码
springboot2-quartz