• 定时任务(二)


    Quartz

    上一篇介绍了@Scheduled注解的使用,接下来我们说一下Quartz的使用

    一般在项目中,除非定时任务涉及到的业务实在是太简单,使用 @Scheduled 注解来解决定时任务,否则大部分情况可能都是使用 Quartz 来做定时任务。在 Spring Boot 中使用 Quartz ,只需要在创建项目时,添加 Quartz 依赖即可:

    项目创建完成后,还需要添加定时任务的注解

     

    Quartz 在使用过程中,有两个关键概念,一个是JobDetail(要做的事情),另一个是触发器(什么时候做),要定义 JobDetail,需要先定义 Job,Job 的定义有两种方式:

    第一种方式,直接定义一个Bean:

    1. package com.example.job;
    2. import org.springframework.stereotype.Component;
    3. import java.util.Date;
    4. @Component
    5. public class MyJob1 {
    6. public void sayHello(){
    7. System.out.println("MyJob1>>>"+new Date());
    8. }
    9. }

    关于这种方式说两点:
    1.首先将这个Job注册到Spring容器中.
     2.这种定义方式有一个缺陷,就是无法传参 

    第二种定义方式,则是继承 QuartzJobBean 并实现默认的方法:

    1. package com.example.job;
    2. import com.example.service.HelloService;
    3. import org.quartz.JobExecutionContext;
    4. import org.quartz.JobExecutionException;
    5. import org.springframework.scheduling.quartz.QuartzJobBean;
    6. public class MyJob2 extends QuartzJobBean {
    7. HelloService helloService;
    8. public HelloService getHelloService(){
    9. return helloService;
    10. }
    11. public void setHelloService(HelloService helloService){
    12. this.helloService = helloService;
    13. }
    14. @Override
    15. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
    16. helloService.sayHello();
    17. }
    18. }

    和第一种方式相比,这种方式支持传参没任务启动时,executeInternal方法将会执行.

    Job 有了之后,接下来我们创建类,配置 JobDetail 和 Trigger 触发器,内容如下:

    1. package com.example.config;
    2. import com.example.job.MyJob2;
    3. import com.example.service.HelloService;
    4. import org.quartz.JobDataMap;
    5. import org.springframework.context.annotation.Bean;
    6. import org.springframework.context.annotation.Configuration;
    7. import org.springframework.scheduling.quartz.*;
    8. import java.util.Date;
    9. @Configuration
    10. public class QuartzConfig {
    11. @Bean
    12. MethodInvokingJobDetailFactoryBean methodInvokingJobDetailFactoryBean() {
    13. MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean();
    14. bean.setTargetBeanName("myJob1");
    15. bean.setTargetMethod("sayHello");
    16. return bean;
    17. }
    18. @Bean
    19. JobDetailFactoryBean jobDetailFactoryBean() {
    20. JobDetailFactoryBean bean = new JobDetailFactoryBean();
    21. bean.setJobClass(MyJob2.class);
    22. JobDataMap map = new JobDataMap();
    23. map.put("helloService", helloService());
    24. bean.setJobDataMap(map);
    25. return bean;
    26. }
    27. @Bean
    28. SimpleTriggerFactoryBean simpleTriggerFactoryBean() {
    29. SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean();
    30. bean.setStartTime(new Date());
    31. bean.setRepeatCount(5);
    32. bean.setJobDetail(methodInvokingJobDetailFactoryBean().getObject());
    33. bean.setRepeatInterval(3000);
    34. return bean;
    35. }
    36. @Bean
    37. CronTriggerFactoryBean cronTrigger() {
    38. CronTriggerFactoryBean bean = new CronTriggerFactoryBean();
    39. bean.setCronExpression("0/30 * * * * ?");
    40. bean.setJobDetail(jobDetailFactoryBean().getObject());
    41. return bean;
    42. }
    43. @Bean
    44. SchedulerFactoryBean schedulerFactoryBean() {
    45. SchedulerFactoryBean bean = new SchedulerFactoryBean();
    46. bean.setTriggers(cronTrigger().getObject(), simpleTriggerFactoryBean().getObject());
    47. return bean;
    48. }
    49. @Bean
    50. HelloService helloService() {
    51. return new HelloService();
    52. }
    53. }

    关于这个配置说如下几点:
     1. JobDetail 的配置有两种方式:MethodInvokingJobDetailFactoryBean 和 JobDetailFactoryBean 。
     2. 使用 MethodInvokingJobDetailFactoryBean 可以配置目标 Bean 的名字和目标方法的名字,这种方式不支持传参。
     3. 使用 JobDetailFactoryBean 可以配置 JobDetail ,任务类继承自 QuartzJobBean ,这种方式支持传参,将参数封装在 JobDataMap 中进行传递。
     4. Trigger 是指触发器,Quartz 中定义了多个触发器,这里向大家展示其中两种的用法,SimpleTrigger 和 CronTrigger 。
     5. SimpleTrigger 有点类似于前面说的 @Scheduled 的基本用法。
     6. CronTrigger 则有点类似于 @Scheduled 中 cron 表达式的用法。
     

    全部执行完毕之后,启动Spring Boot项目就可以看到定时任务的执行了

    以上内容就是关于定时任务的几个用法,希望可以帮助到大家 

  • 相关阅读:
    【Qt6.3 基础教程 05】 掌握Qt Widgets:使用 QLabel 和 QPushButton
    Go和Java实现代理模式
    Linux学习笔记14 - 多线程编程(一)
    vue源码笔记之compiler编译器
    java计算机毕业设计网上图书销售系统源程序+mysql+系统+lw文档+远程调试
    关爱2700多万听障者,手语服务助力无声交流
    CoreWCF 1.0 正式发布,支持 .NET Core 和 .NET 5+ 的 WCF
    【学一点儿前端】ajax、axios和fetch的概念、区别和易混淆点
    LFM信号加噪、时频分析、滤波
    V神个人调查报告:哪位圈内名人最受V神尊重?中国受V神喜欢吗?
  • 原文地址:https://blog.csdn.net/LKS_010620/article/details/125528267