认识 Quartz 框架

Deadly 提交于 2020-03-22 16:05:37

今天我带大家认识一下Quartz

一、认识 Quartz 框架
      Quartz 是 OpenSymphony 开源组织的一个 Java 开源项目, 在 2009 被 Terracotta 收购。Quartz 是一个任务
调度框架,比如你遇到这样的问题:
  1、每月10自动还花呗
  2、每隔一小时备份一下自己的学习笔记到云盘
  3、每隔半小时,扫描订单信息等等
       总结起来就是:在某一个有规律的时间点干某件事。并且事件的触发条件可以非常复杂(比如每月
最后一个工作日的 17:50),复杂到需要一个专门的框架来干这个事。 Quartz 就是来干这样的事,你给它一个
触发条件的定义,它负责到了时间点,触发相应的 Job(任务)起来干活
 
        Quartz 是开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它同时保持了使用的简
单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可以对触发器和任务进行关联映射
总结一下Quartz框架的特点:
  1、强大的调度功能,例如支持多样的调度方式
  2、灵活的应用方式,例如支持任务和调度的多种组合方式
  3、分布式和集群功能,Terracotta 在收购后,对原来功能作了进一步提升
有关调度的三个主要的概念:
  1、调度器 :Quartz 框架的核心是调度器。调度器负责管理 Quartz 应用 运行时环境。调度器不是靠自己做
所有的工作,而是依赖框架内一些非常重要的部件。为确保可伸缩性,Quartz 采用了基于多线程的架构。
启动时,框架初始化一套 worker 线程,这套线程被调度器用来执行预定的作业。这就是 Quartz 怎样能
并发运行多个作业的原理。Quartz 依赖一套松耦合的线程池管理部件来管理线程环境
  2、任务:就是我们自己编写的业务逻辑,交给 quartz 帮我们执行
  3、触发器:即调度作业,什么时候开始执行,什么时候结束执行
二、Quartz 框架核心概念
  Quartz 任务调度的主要组成元素有:
   1、Trigger(触发器)
   2、Scheduler(任务调度器)
   3、Job(任务)
具体描述:
   1、JobDetail:quartz 每次都会直接创建一个 JobDetail,同时创建一个 Job 实例,它不直接接受一个 Job
的实例,但是它接受一个 Job 的实现类,通过 new instance()的反射方式来实例一个 Job,在这里 Job
是一个接口,我们需要自己编写类去实现这个接口
   2、Trigger : 它由 SimpleTrigger 和 CronTrigger 组成,当仅需要触发一次或者以固定间隔周期性触发执
行,SimpleTrigger是最适合的选择。而CronTrigger则可以定义Cron 表达式定义出各种复杂的调度
方案,如每天上午 9:00 执行,每周一、周三、周五下午 5:00 执行
  3、Scheduler:调度器,JobDetail 和 Trigger 可以通过 Scheduler 绑定到一起
 
我们用图片来展示一下Quartz 基本元素的关系
三、SpringBoot 集成 Quartz 框架 
步骤
  1、引入 Quartz 依赖
   基本依赖我们在上一章写过,这一章我们就不写了
<!-- pom文件 Spring Quartz依赖 -->
<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.1</version>
  <exclusions>
     <exclusion>
       <artifactId>slf4j-api</artifactId>
       <groupId>org.slf4j</groupId>
    </exclusion>
  </exclusions>
</dependency>

 2、我们需要使用注解@Configuration 来定义一个配置类

3、为了方便我们看清楚任务调度的次数,我们声明一个辅助类

 4、接下创建一个任务调度的类


注意:cron = "*/5 * * * * ? "表达式表示秒分时日月年。*/5 表示每隔 5 秒
          @EnableScheduling:放在类前,标注启动定时任务          @Scheduled(表达式): 放在方法前,定义某个定时任务
5、最后定义主模块启动类,启动测试即可
别忘了写App启动类哦

在控制层看一些效果

 

Cron 的表达式 
 
通配符说明:
   1、* 表示所有值。例如:在分的字段上设置 "*",表示每一分钟都会触发
   2、? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的 10 号触发一个操作,
但不关心是周几,所以需要周位置的那个字段设置为"?"具体设置为 0 0 0 10 * ? 
   3、- 表示区间。例如在小时上设置"10-12",表示 10,11,12 点都会触发
   4、, 表示指定多个值,例如在周字段上设置"MON,WED,FRI",表示周一,周三和周五触发
   5、/ 用于递增触发。如在秒上面设置"5/15" 表示从 5 秒开始,每增 15 秒触发(5,20,35,50)。 在月字段上设置
'1/3'所示每月 1 号开始,每隔三天触发一次。用户也可以使用*/y,它等同于 0/y 
   6、L 表示最后的意思。只在日期和星期字段中使用。在日字段设置上,表示当月的最后一天 (依据当前月份,
如果是二月还会依据是否是润年),在周字段上表示星期六,相当于"7"或"SAT",这里的规则是周日为一周的第一天,周六是最后一天。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置 "6L"这样的格式,
则表示“本月最后一个星期五”
   7、W 表示离指定日期的最近那个工作日(周一至周五)。例如在日字段上设置"15W",表示离每月 15 号最近的
那个工作日触发。如果 15 号正好是周六,则找最近的周五(14 号)触发,如果 15 号是周未,则找最近的下周一(16
号)触发。如果 15 号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月 1 号
往后最近的工作日触发。如果 1 号正是周六,则将在 3 号下周一触发。(注,"W"前只能设置具体的数字,不 允许
区间"-")
   8、# 序号,该字符只能在星期字段中使用,表示当月某个工作日。如 6#3 表示当月的第三个星期五(6 表示
星 期五,#3 表示当前的第三个),而 4#5 表示当月的第五个星期三,如果没有第五个星期三,则不触发

 

 

 
 
 
 
 
 
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!