4.5.7、服务重启补偿
在应用程序正常运行的时候,虽然没问题,但是当我们重启服务的时候,这个时候内存的里面的定时任务其实全部都被销毁,因此在应用程序启动的时候,还需要将正常的任务重新加入到服务中!
@Component public class TaskConfigApplicationRunner implements ApplicationRunner { @Autowired private QuartzBeanRepository repository; @Autowired private Scheduler scheduler; @Override public void run(ApplicationArguments args) throws Exception { List<QuartzBean> list = repository.findAll(); if(!CollectionUtils.isEmpty(list)){ for (QuartzBean quartzBean : list) { //加载启动类型的定时任务 if(quartzBean.getStatus().intValue() == 0){ QuartzUtils.createScheduleJob(scheduler,quartzBean); } //加载暂停类型的定时任务 if(quartzBean.getStatus().intValue() == 1){ QuartzUtils.createScheduleJob(scheduler,quartzBean); QuartzUtils.pauseScheduleJob(scheduler, quartzBean.getJobName()); } } } } }
在服务重启的时候,会重新将有效任务加入quartz 中!
4.5.8、接口服务测试
- 调用
quartz/createJob
接口,创建任务
=========开始创建任务========= =========创建任务成功,信息:{"cronExpression":"0/5 * * * * ?","id":"9280b799-f762-47b5-90e4-4874e1ad3c60","jobClass":"com.example.quartz.config.TestTask","jobName":"myJob","status":0} testTask:2020-12-07 22:31:05 testTask:2020-12-07 22:31:10 testTask:2020-12-07 22:31:15 ...
- 调用
quartz/pauseJob
接口,暂停任务
=========开始暂停任务,请求参数:{"id":"9280b799-f762-47b5-90e4-4874e1ad3c60","jobName":"myJob"} =========暂停任务成功=========
- 调用
quartz/runOnce
接口,立即运行一次定时任务
=========立即运行一次定时任务,请求参数:{"jobName":"myJob"} =========立即运行一次定时任务========= testTask:2020-12-07 22:36:30
- 调用
quartz/resume
接口,恢复定时任务
=========恢复定时任务,请求参数:{"id":"9280b799-f762-47b5-90e4-4874e1ad3c60","jobName":"myJob"} =========恢复定时任务========= testTask:2020-12-07 22:38:00 testTask:2020-12-07 22:38:05 testTask:2020-12-07 22:38:10 ...
- 调用
quartz/update
接口,更新定时任务
=========更新定时任务,请求参数:{"cronExpression":"0/10 * * * * ?","id":"9280b799-f762-47b5-90e4-4874e1ad3c60","jobClass":"com.example.quartz.config.TestTask","jobName":"myJob"} =========更新定时任务========= testTask:2020-12-07 22:39:10 testTask:2020-12-07 22:39:20 testTask:2020-12-07 22:39:30 ...
- 调用
quartz/delete
接口,删除定时任务
=========删除定时任务,请求参数:{"id":"9280b799-f762-47b5-90e4-4874e1ad3c60","jobName":"myJob"}========= =========删除定时任务=========
4.5.9、添加监听器(选用)
当然,如果你想对某个任务实现监听,只需要添加一个配置类,将其注入即可!
@Configuration public class TestTaskConfig { @Primary @Bean public Scheduler initScheduler() throws SchedulerException { Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //添加SchedulerListener监听器 scheduler.getListenerManager().addSchedulerListener(new SimpleSchedulerListener()); // 创建并注册一个全局的Trigger Listener scheduler.getListenerManager().addTriggerListener(new SimpleTriggerListener(), EverythingMatcher.allTriggers()); // 创建并注册一个全局的Job Listener scheduler.getListenerManager().addJobListener(new SimpleJobListener(), EverythingMatcher.allJobs()); scheduler.start(); return scheduler; } }
4.5.10、小结
需要注意的是:在 quartz 任务暂停之后再次启动时,会立即执行一次,在更新之后也会立即执行一次任务调度!
五、总结
本文主要围绕 quartz 的架构以及Springboot + quartz
项目整合和应用做了初步的介绍。
可能有的朋友会发问,quartz 已经有对应的任务表,不需要手动创建,只需要配置quartz.properties
文件即可!
没错,quartz
官方提供了对应任务表,主要用于分布式架构下的任务处理!
如果只是单体应用,可以参考本文中创建一张单表来存储任务,实现简单!
如果集群环境部署,在下篇文章中,我们会详细的介绍quartz
分布式架构的开发和应用!
鉴于笔者才疏学浅,如果发现有错误的地方,欢迎网友批评指导!