SpringBoot 集成 Quartz 定时器

墨蓝 2021-11-10 22:54 452阅读 0赞

今天,日月教大家如何使用springBoot集成Quartz(定时器),沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 。

为什么要使用Quartz

多任务情况下,quartz更容易管理,可以实现动态配置

集成Quartz

1、maven依赖

  1. <dependency>
  2. <groupId>org.quartz-scheduler</groupId>
  3. <artifactId>quartz</artifactId>
  4. <version>2.2.1</version>
  5. </dependency>

2、测试Job类

  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import org.quartz.Job;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. /**
  7. *
  8. * @ClassName: SchedulerQuartzJobUpOffLine
  9. * @Description: 实现Job接口 监听服务上下线的定时器
  10. * @author chenqi
  11. * @date 2018年9月4日
  12. *
  13. */
  14. public class SchedulerQuartzJobTest implements Job{
  15. private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  16. private void before(){
  17. System.out.println("任务开始执行-" + dateFormat.format(new Date()));
  18. }
  19. @Override
  20. public void execute(JobExecutionContext arg0) throws JobExecutionException {
  21. before();
  22. System.out.println("业务逻辑。。。");
  23. after();
  24. }
  25. private void after(){
  26. System.out.println("任务执行结束");
  27. }
  28. }

3、定时器管理类

  1. package com.chenqi.springBootQuartz.quartz;
  2. import java.util.Date;
  3. import org.quartz.CronScheduleBuilder;
  4. import org.quartz.CronTrigger;
  5. import org.quartz.JobBuilder;
  6. import org.quartz.JobDetail;
  7. import org.quartz.JobKey;
  8. import org.quartz.Scheduler;
  9. import org.quartz.SchedulerException;
  10. import org.quartz.TriggerBuilder;
  11. import org.quartz.TriggerKey;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.context.annotation.Configuration;
  14. import com.chenqi.springBootQuartz.quartz.job.SchedulerQuartzJobTest;
  15. /**
  16. *
  17. * @ClassName: QuartzScheduler
  18. * @Description: 任务调度处理
  19. * @author chenqi
  20. * @date 2018年9月4日
  21. *
  22. */
  23. @Configuration
  24. public class QuartzSchedulerManager {
  25. // 任务调度
  26. @Autowired
  27. private Scheduler scheduler;
  28. /**
  29. * 开始执行定时器
  30. *
  31. * @throws SchedulerException
  32. */
  33. public void startJob() throws SchedulerException {
  34. startJobTest(scheduler);
  35. scheduler.start();
  36. }
  37. /**
  38. * 获取Job信息
  39. *
  40. * @param name
  41. * @param group
  42. * @return
  43. * @throws SchedulerException
  44. */
  45. public String getJobInfo(String name, String group) throws SchedulerException {
  46. TriggerKey triggerKey = new TriggerKey(name, group);
  47. CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  48. return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),
  49. scheduler.getTriggerState(triggerKey).name());
  50. }
  51. /**
  52. * 修改某个任务的执行时间
  53. *
  54. * @param name
  55. * @param group
  56. * @param time
  57. * @return
  58. * @throws SchedulerException
  59. */
  60. public boolean modifyJob(String name, String group, String time) throws SchedulerException {
  61. Date date = null;
  62. TriggerKey triggerKey = new TriggerKey(name, group);
  63. CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
  64. String oldTime = cronTrigger.getCronExpression();
  65. if (!oldTime.equalsIgnoreCase(time)) {
  66. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
  67. CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(name, group)
  68. .withSchedule(cronScheduleBuilder).build();
  69. date = scheduler.rescheduleJob(triggerKey, trigger);
  70. }
  71. return date != null;
  72. }
  73. /**
  74. * 暂停所有任务
  75. *
  76. * @throws SchedulerException
  77. */
  78. public void pauseAllJob() throws SchedulerException {
  79. scheduler.pauseAll();
  80. }
  81. /**
  82. * 暂停某个任务
  83. *
  84. * @param name
  85. * @param group
  86. * @throws SchedulerException
  87. */
  88. public void pauseJob(String name, String group) throws SchedulerException {
  89. JobKey jobKey = new JobKey(name, group);
  90. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
  91. if (jobDetail == null)
  92. return;
  93. scheduler.pauseJob(jobKey);
  94. }
  95. /**
  96. * 恢复所有任务
  97. *
  98. * @throws SchedulerException
  99. */
  100. public void resumeAllJob() throws SchedulerException {
  101. scheduler.resumeAll();
  102. }
  103. /**
  104. * 恢复某个任务
  105. *
  106. * @param name
  107. * @param group
  108. * @throws SchedulerException
  109. */
  110. public void resumeJob(String name, String group) throws SchedulerException {
  111. JobKey jobKey = new JobKey(name, group);
  112. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
  113. if (jobDetail == null)
  114. return;
  115. scheduler.resumeJob(jobKey);
  116. }
  117. /**
  118. * 删除某个任务
  119. *
  120. * @param name
  121. * @param group
  122. * @throws SchedulerException
  123. */
  124. public void deleteJob(String name, String group) throws SchedulerException {
  125. JobKey jobKey = new JobKey(name, group);
  126. JobDetail jobDetail = scheduler.getJobDetail(jobKey);
  127. if (jobDetail == null)
  128. return;
  129. scheduler.deleteJob(jobKey);
  130. }
  131. /**
  132. *
  133. * @Title: startJobTest
  134. * @Description: 启动 定时器 test
  135. * @param scheduler
  136. * @throws SchedulerException 参数
  137. * void 返回类型
  138. */
  139. private void startJobTest(Scheduler scheduler) throws SchedulerException {
  140. // 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
  141. // JobDetail 是具体Job实例
  142. JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJobTest.class).withIdentity("job1", "group1").build();
  143. // 基于表达式构建触发器
  144. CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
  145. // CronTrigger表达式触发器 继承于Trigger
  146. // TriggerBuilder 用于构建触发器实例
  147. CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")
  148. .withSchedule(cronScheduleBuilder).build();
  149. scheduler.scheduleJob(jobDetail, cronTrigger);
  150. }
  151. }

4、定时器初始化类

  1. package com.chenqi.springBootQuartz.quartz;
  2. import org.quartz.Scheduler;
  3. import org.quartz.SchedulerException;
  4. import org.quartz.SchedulerFactory;
  5. import org.quartz.impl.StdSchedulerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.context.ApplicationListener;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import org.springframework.context.event.ContextRefreshedEvent;
  11. /**
  12. *
  13. * @ClassName: ApplicationStartQuartzJobListener
  14. * @Description: 服务启动 初始化定时器
  15. * @author chenqi
  16. * @date 2018年9月5日
  17. *
  18. */
  19. @Configuration
  20. public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent>{
  21. @Autowired
  22. private QuartzSchedulerManager quartzSchedulerManager;
  23. /**
  24. * 初始启动quartz
  25. */
  26. @Override
  27. public void onApplicationEvent(ContextRefreshedEvent event) {
  28. try {
  29. quartzSchedulerManager.startJob();
  30. System.out.println("任务已经启动...");
  31. } catch (SchedulerException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. /**
  36. * 初始注入scheduler
  37. * @return
  38. * @throws SchedulerException
  39. */
  40. @Bean
  41. public Scheduler scheduler() throws SchedulerException{
  42. SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
  43. return schedulerFactoryBean.getScheduler();
  44. }
  45. }

5、封装api

  1. package com.chenqi.springBootQuartz.controller;
  2. import org.quartz.SchedulerException;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import com.chenqi.springBootQuartz.quartz.QuartzSchedulerManager;
  7. /**
  8. *
  9. * @ClassName: QuartzController
  10. * @Description: 定时器api
  11. * @author chenqi
  12. * @date 2018年9月18日
  13. *
  14. */
  15. @RestController
  16. @RequestMapping("/quartz")
  17. public class QuartzController {
  18. @Autowired
  19. private QuartzSchedulerManager quartzSchedulerManager;
  20. /**
  21. *
  22. * @Title: startQuartzJob
  23. * @Description: 启动所有定时器
  24. * @return void
  25. */
  26. @RequestMapping("/start")
  27. public void startQuartzJob() {
  28. try {
  29. quartzSchedulerManager.startJob();
  30. } catch (SchedulerException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. /**
  35. *
  36. * @Title: getQuartzJob
  37. * @Description: 获取定时器信息
  38. * @param name
  39. * @param group
  40. * @return
  41. * @return String
  42. */
  43. @RequestMapping("/info")
  44. public String getQuartzJob(String name, String group) {
  45. String info = null;
  46. try {
  47. info = quartzSchedulerManager.getJobInfo(name, group);
  48. } catch (SchedulerException e) {
  49. e.printStackTrace();
  50. }
  51. return info;
  52. }
  53. /**
  54. *
  55. * @Title: modifyQuartzJob
  56. * @Description: 修改定时器的 执行时间
  57. * @param name
  58. * @param group
  59. * @param time
  60. * @return
  61. * @return boolean
  62. */
  63. @RequestMapping("/modify")
  64. public boolean modifyQuartzJob(String name, String group, String time) {
  65. boolean flag = true;
  66. try {
  67. flag = quartzSchedulerManager.modifyJob(name, group, time);
  68. } catch (SchedulerException e) {
  69. e.printStackTrace();
  70. }
  71. return flag;
  72. }
  73. /**
  74. *
  75. * @Title: pauseQuartzJob
  76. * @Description: 暂停指定 定时器
  77. * @param name
  78. * @param group
  79. * @return void
  80. */
  81. @RequestMapping(value = "/pause")
  82. public void pauseQuartzJob(String name, String group) {
  83. try {
  84. quartzSchedulerManager.pauseJob(name, group);
  85. } catch (SchedulerException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. /**
  90. *
  91. * @Title: pauseAllQuartzJob
  92. * @Description: 暂停所有定时器
  93. * @return void
  94. */
  95. @RequestMapping(value = "/pauseAll")
  96. public void pauseAllQuartzJob() {
  97. try {
  98. quartzSchedulerManager.pauseAllJob();
  99. } catch (SchedulerException e) {
  100. e.printStackTrace();
  101. }
  102. }
  103. /**
  104. *
  105. * @Title: deleteJob
  106. * @Description: 删除指定定时器
  107. * @param name
  108. * @param group
  109. * @return void
  110. */
  111. @RequestMapping(value = "/delete")
  112. public void deleteJob(String name, String group) {
  113. try {
  114. quartzSchedulerManager.deleteJob(name, group);
  115. } catch (SchedulerException e) {
  116. e.printStackTrace();
  117. }
  118. }
  119. }

6、启动测试
启动类:

  1. package com.chenqi.springBootQuartz;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.scheduling.annotation.EnableScheduling;
  5. @SpringBootApplication
  6. @EnableScheduling
  7. public class SpringBootQuartzApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(SpringBootQuartzApplication.class, args);
  10. }
  11. }

在这里插入图片描述

定时器正常启动执行,我们试试通过API修改定时器执行时间
浏览器访问:
http://localhost:8080/quartz/modify?name=job1&group=group1&time=0/10 * * * * ?

定时器执行间隔改为10秒执行一次,查看控制台日志
在这里插入图片描述

可以看到,修改成功,至此,springBoot 集成 quartz完成,并实现了api动态管理。

发表评论

表情:
评论列表 (有 0 条评论,452人围观)

还没有评论,来说两句吧...

相关阅读