一、简述

项目中,我们可能需要从Redis、消息发送等执行异步定时任务。

二、快速上手

1、引入依赖

  1. <!-- Quartz定时任务 -->
  2. <dependency>
  3. <groupId>org.quartz-scheduler</groupId>
  4. <artifactId>quartz</artifactId>
  5. </dependency>
  6. <!--定时任务需要依赖context模块-->
  7. <dependency>
  8. <groupId>org.springframework</groupId>
  9. <artifactId>spring-context-support</artifactId>
  10. </dependency>

2、创建多个定时任务

  1. @Component
  2. @EnableScheduling
  3. public class NoteLikeTaskJob {
  4. public void firstJob(){
  5. System.out.println("执行定时任务1");
  6. }
  7. }
  8. @Component
  9. @EnableScheduling
  10. public class CommentLikeTaskJob {
  11. public void second(){
  12. System.out.println("执行定时任务2");
  13. }
  14. }

3、创建SpringUtil工具类

  1. @Component
  2. public class SpringUtil implements ApplicationContextAware {
  3. private static ApplicationContext applicationContext;
  4. @Override
  5. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  6. if (SpringUtil.applicationContext == null) {
  7. SpringUtil.applicationContext = applicationContext;
  8. }
  9. }
  10. //获取applicationContext
  11. public static ApplicationContext getApplicationContext() {
  12. return applicationContext;
  13. }
  14. //通过name获取 Bean.
  15. public static Object getBean(String name) {
  16. return getApplicationContext().getBean(name);
  17. }
  18. //通过class获取Bean.
  19. public static <T> T getBean(Class<T> clazz) {
  20. return getApplicationContext().getBean(clazz);
  21. }
  22. //通过name,以及Clazz返回指定的Bean
  23. public static <T> T getBean(String name, Class<T> clazz) {
  24. return getApplicationContext().getBean(name, clazz);
  25. }
  26. }

4、创建Quartz定时任务配置

  1. @Configuration
  2. public class QuartzConfig {
  3. /**
  4. * 配置作业调度器
  5. * 可通过Trigger的个数来决定需要配置多少个触发器
  6. * @param firstTrigger 第一个定时任务触发器
  7. * @param secondTrigger 第二个定时任务触发器
  8. * @return
  9. */
  10. @Bean(name = "scheduler")
  11. public SchedulerFactoryBean schedulerFactory(Trigger firstTrigger, Trigger secondTrigger) {
  12. SchedulerFactoryBean bean = new SchedulerFactoryBean();
  13. // 延时启动,应用启动5秒后
  14. bean.setStartupDelay(5);
  15. // 注册触发器
  16. bean.setTriggers(firstTrigger, secondTrigger);
  17. return bean;
  18. }
  19. /**
  20. * 配置定时任务1
  21. * @return
  22. */
  23. @Bean(name = "firstJobDetail")
  24. public MethodInvokingJobDetailFactoryBean firstJobDetail() {
  25. NoteLikeTaskJob scheduledJob1 = SpringUtil.getBean(NoteLikeTaskJob.class);
  26. MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
  27. // 是否并发执行
  28. jobDetail.setConcurrent(false);
  29. // 为需要执行的实体类对应的对象
  30. jobDetail.setTargetObject(scheduledJob1);
  31. // 需要执行的方法
  32. jobDetail.setTargetMethod("firstJob");
  33. return jobDetail;
  34. }
  35. /**
  36. * 配置定时任务1的触发器
  37. * @param firstJobDetail
  38. * @return
  39. */
  40. @Bean(name = "firstTrigger")
  41. public CronTriggerFactoryBean firstTrigger(JobDetail firstJobDetail) {
  42. CronTriggerFactoryBean factory=new CronTriggerFactoryBean();
  43. factory.setJobDetail(firstJobDetail);
  44. factory.setCronExpression("0/5 * * * * ? *");
  45. return factory;
  46. }
  47. /**
  48. * 配置定时任务2
  49. * @return
  50. */
  51. @Bean(name = "secondJobDetail")
  52. public MethodInvokingJobDetailFactoryBean secondJobDetail(CommentLikeTaskJob commentLikeTaskJob) {
  53. MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
  54. /*
  55. * 是否并发执行
  56. * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了,
  57. * 如果此处为true,则下一个任务会bing执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行
  58. */
  59. //jobDetail.setConcurrent(true);
  60. // 为需要执行的实体类对应的对象
  61. jobDetail.setTargetObject(commentLikeTaskJob);
  62. // 需要执行的方法
  63. jobDetail.setTargetMethod("secondJob");
  64. return jobDetail;
  65. }
  66. /**
  67. * 配置定时任务2的触发器
  68. * @param secondJobDetail
  69. * @return
  70. */
  71. @Bean(name = "secondTrigger")
  72. public CronTriggerFactoryBean secondTrigger(JobDetail secondJobDetail) {
  73. CronTriggerFactoryBean factory=new CronTriggerFactoryBean();
  74. factory.setJobDetail(secondJobDetail);
  75. factory.setCronExpression("0/10 * * * * ? *");
  76. return factory;
  77. }
  78. }

5、修改启动类

  1. @EnableScheduling
  2. SpringBootApplication