• 什么是Quartz


    什么是Quartz

    quartz:石英钟的意思

    是一个当今市面上流行的高效的任务调用管理工具

    由OpenSymphony开源组织开发

    Symphony:交响乐

    是java编写的,我们使用时需要导入依赖即可

    为什么需要Quartz

    什么是任务调度

    所谓任务调用,就是执行某些具体动作的时间计划

    我们使用过的最简单的调度方法就是Timer

    但是Timer的调度功能过于单一,只能是指定时间的延时调用和周期运行

    而Quartz可以更详细的指定时间,进行计划调用

    Quartz核心组件

     

    调度器:Scheduler

    任务:job

    触发器:Trigger

    调度器来配置\计划什么时间触发什么任务

    简单来说就是调度器规定什么时间做什么事情

    - job(工作\任务):Quartz 实现过程中是一个接口,接口中有一个方法execute(执行的意思)

    ​        我们创建一个类,实现这个接口,在方法中编写要进行的操作(执行具体任务)

    ​        我们还需要一个JobDetail的类型的对象,Quartz每次执行job时

    ​        会实例化job类型对象,去调用这个方法,JobDetail是用来描述Job实现类

    ​        的静态信息,   比如任务运行时在Quartz中的名称

    - Trigger(触发器):能够描述触发指定job的规则,分为简单触发和复杂触发

           简单触发可以使用SimplTrigger实现类.功能类似timer

           复杂触发可以使用CronTrigger实现类,内部利用cron表达式描述各种复杂的时间调度计划

    - Scheduler(调度器):一个可以规定哪个触发器绑定哪个job的容器

          在调度器中保存全部的Quartz 保存的任务

          SpringBoot框架下,添加Quartz依赖后,调度器由SpringBoot管理,我们不需要编写

    Cron表达式

     

    - \* 表示任何值,如果在分的字段上编写*,表示每分钟都会触发

    - , 是个分割符如果秒字段我想20秒和40秒时触发两次就写  20,40

    - \- 表示一个区间 秒字段5-10 表示 5,6,7,8,9,10

    - / 表示递增触发 秒字段 5/10表示5秒开始每隔10秒触发一次

      日字段编写1/3表示从每月1日起每隔3天触发一次

    - ? 表示不确定值, 因为我们在定日期时,一般确定日期就不确定是周几,相反确定周几时就不确定日期

    - L 表示last最后的意思,我们可以设置当月的最后一天,就会在日字段用L表示,

      周字段使用L表示最后一周,一般会和1-7的数字组合

      例如6L表示本月最后一周的周五

    - W (work)表示最近的工作日(单纯的周一到周五) 如果日字段编写15W表示

      每月15日最近的工作日触发,如果15日是周六就14日触发,如果15日是周日就16日触发

    ​        LW通常一起使用,表示本月的最后一个工作日

    - \# 表示第几个,只能使用在周字段上 6#3表示每月的第三个周五

      如果#后面数字写大了,是一个不存在的日期,那就不运行了

      适合设计在母亲节或父亲节这样的日期运行

    网络上可用的Cron表达式生成器很多

    推荐一个http://cron.ciding.cc/

    双11的0时触发

    "0 0 0 11 11 ?"

    每个月10日最近的工作日早上9点发工资

    "0 0 9 10W * ?"

    SpringBoot使用Quartz

    SpringBoot框架下使用Quartz格式还是非常固定的

    我们选用之前学习微服务的项目csmall减少对大项目的影响

    首先添加依赖

    我们选项csmall-stock-webapi模块pom文件

    1. ```xml
    2. <!--  SpringBoot Quartz依赖  -->
    3. <dependency>
    4.     <groupId>org.springframework.boot</groupId>
    5.     <artifactId>spring-boot-starter-quartz</artifactId>
    6. </dependency>
    7. ```

    先编写要执行的任务

    当前项目模块中创建quartz包

    包中创建一个QuartzJob的类,实现Job接口

    代码如下

    1. ```java
    2. public class QuartzJob implements Job {
    3.     @Override
    4.     public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    5.         // 输出当前时间
    6.         System.out.println("--------------"+ LocalDateTime.now()+"---------------");
    7.     }
    8. }
    9. ```

     上面编写的是Job接口的实现类,要想运行还需要将它封装为JobDetail对象保存在Spring容器中

    还有要创建一个Trigger设置要运行的时机,也保存到Spring容器中

    在quartz包下,再创建一个QuartzConfig类,其中编写它们的调度绑定关系

    这个格式是固定的,后面再需要绑定,直接套用即可

    1. ```java
    2. // 当前类是在配置Spring容器中的调度器Scheduler
    3. // 所有配置Spring内容的配置类,必须添加@Configuration注解
    4. @Configuration
    5. public class QuartzConfig {
    6.     // 创建一个JobDetail(工作详情)对象,并将它保存到Spring容器中
    7.     // 这个对象中要包含要运行的Job接口实现类的反射
    8.     // @Bean注解会将其后的方法的返回值保存到Spring容器中
    9.     @Bean
    10.     public JobDetail showTime(){
    11.         System.out.println("showTime方法运行");
    12.         return JobBuilder.newJob(QuartzJob.class)
    13.                 // 给这个JobDetail定个名字
    14.                 .withIdentity("datetime")
    15.                 // 即使没有触发器绑定当前JobDetail也不会将它删除
    16.                 .storeDurably()
    17.                 .build();
    18.     }

        // 下面要声明触发器对象,它设置job何时运行,也是保存到Spring容器中

    1.     @Bean
    2.     public Trigger showTimeTrigger(){
    3.         System.out.println("showTimeTrigger方法运行");
    4.         // 定义Cron表达式
    5.         CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule("0 57 17 5 8 ?");
    6.         return TriggerBuilder.newTrigger()
    7.                 // 绑定要运行的jobDetail对象
    8.                 .forJob(showTime())
    9.                 // 绑定当前触发器名称
    10.                 .withIdentity("dateTrigger")
    11.                 // 绑定cron表达式
    12.                 .withSchedule(cronScheduleBuilder)
    13.                 .build();
    14.     }
    15. }

  • 相关阅读:
    Java:BIO、NIO、AIO
    2022西门子白帽黑客大赛丨工控安全赛事新起点 人才培养见真章
    Python编程 字典创建map与Zip
    数学建模之Matlab基础操作
    自动驾驶:路径规划概述
    子类加@Data后,IDEA调试时“出现”父类属性无值
    at编译环境搭建-win
    PCR/qPCR研究:Lumiprobe丨dsGreen 用于实时 PCR
    复制粘贴,快速将Python程序打包成exe
    学术大神推荐的好用科研工具
  • 原文地址:https://blog.csdn.net/weixin_68138130/article/details/126678801