Quartz组件介绍

Quartz是一个由java编写的开源的Job调度框架,下面对其进行一个比较详细的介绍

  • 核心组件API介绍
  • 调度流程分析
  • 调度示例

核心组件API介绍
SchedulerFactory / Scheduler / QuartzScheduler /

JobBuilder / JobDetail / Job / InterruptableJob / JobKey / JobStore / JobDataMap

  • JobBuilder用来构造JobDetail对象(jobDetails同样没有提供构造函数)
  • JobDetail是对Job的一个装饰(功能更强),Quartz中不会直接存储Job类,而是用包装后的JobDetail代表一个作业实例
  • Job接口才是程序业务真正执行的地方,开发中的任务类一般都实现该接口,一个Job可以理解成一个开发好的任务类。
     voidexecute(JobExecutionContext context) 
  • InterruptableJob(可中断的Job)是Job的子接口,提供了一个中断功能,实现该接口的作业可以被中断
     void

    interrupt()     在业务类中通过该方法,响应中断操作

  • JobKey唯一的标识一个JobDetail,键由名称和组组成,相同组中的名称必须是唯一的。
  • JobDataMap,是JobDetail对象的一部分,本质上是Java Map接口的一个实现,提供一系列的put/get等方法,常用来存储一些Job执行时需要的环境参数。

TriggerBuilder / Trigger / TriggerKey / SimpleTrigger / CronTrigger
  TriggerBuilder 用来构造Trigger。一个触发器只能指向一个Job,多个触发器可以指向同一个Job(即一个Job可以被多个触发器触发)。
  TriggerKey唯一的标识一个触发器,键同样由名称和组组成,组中的名称必须是唯一的。    
  SimpleTrigger是一种比较简单的Trigger,适用执行一次,或指定时间点执行,或在给定的延迟内重复N次这些场景;而CromTrigger功能强大很多,允许根据每天、每周、每月和每年的月的时间进行调度,支持cron表达式。

Trgger详解

Cron表达式详解
    
  Cron-Expressions是由七个子表达式组成的一个字符串,每个子表达式之间用空格隔开,每个子表达式含义及常量值如下

字段名称强制性允许的值允许的特殊字符
0-59, - * /
0-59, - * /
0-23, - * /
1-31(准确的说是1-当月最后一天), - *?/ LW
1-12或JAN-DEC(官网其它地方7说0-11,经测试是错误的说法), - * /
星期几/周几1-7或SUN-SAT(英文不区分大小写,上同), - *?/ L#
没有(可为空)空,1970-2099, - * /

关于特殊字符的介绍

 

  • “ * "表示“每”的意思,如月表达式"*"表示每个月,周表达式"*"表示一周中的每一天。
  • " / "表示增量,如分表达式"0/15",则表示“从第0分钟开始,每隔15分钟...",相当于分表达式"0,15,30,45"。
    但单纯的"/15"则表示每小时的第15分钟,并不表示每15分钟...,等价于"0,15"
  • " ? "只能在日和周表达式中使用,表示“无特定值”。
  • “L”是“last”的简称,只允许在日和周表达式中使用。单独使用时,月表达式“?”表示月的最后一日,周表达式“?”表示周的最后一天(周六)。综合使用时,如“FRIL”或"6L"则表示“该月的最后一个星期五“;“L-3”表示每月的倒数第三天。
    官方文档对于“L"选项的建议是:使用“L”选项时,不要指定列表或值范围,否则容易产生意外结果。
  • "W" 只允许用于表达式中,表示最接近给定日期的工作日(周一至周五)。如"15W"表示最接近15号的工作日,如"LW"则表示最后一个工作日。
  • "#" 只允许用于表达式中,用于指定该月的“第n个周n"。例如,周表达式“6#3”或“FRI#3”都表示“该月的第三个星期五”。

比如
"0 0 12 ? * WED" — 表示”每周三中午12:00:00“。
“0 0/5 * * *?” 表示从0分开始,每隔5分钟执行一次。
“10 0/5 * * *?” 表示从0分10秒开始,每隔5分钟执行一次。
“0 30 10-13?* WED,FRI“ 表示每周三和周五的10点到13点时(含),第30分钟时执行一次。即10:30,11:30,12:30,13:30。
“0 0/30 8-9 5,20 *?” 每月5号和20号,8点和9点时,从0分开始,每隔30分钟执行一次。即8:00、8:30、9:00、9:30

JobListener / TriggerListener / SchedulerListener 

  • JobListener接口监听JobDetail的执行并提供相应通知,如执行前、执行后等。
  • TriggerListener接口提供Trigger触发情况,如触发器被触发、触发完成(即关联的JobDetail执行完成)、触发失败等。
  • SchedulerListener 接口提供调度器事件通知,如scheduler的启动/停止、JobDetail的添加/移除/暂停/恢复运行、Trigger的暂停/恢复等事件。 

注意点

  • 任务类必须是public修饰,所以不能定义成内部类,也不能是同文件中非public类。否则异常: Problem instantiating class 'cn.net.quartz.demo.TestJob' [See nested exception: java.lang.IllegalAccessException: Class org.quartz.simpl.SimpleJobFactory can not access a member of class cn.net.quartz.demo.TestJob with modifiers "public"]
  •  没有绑定触发器的JobDetail必须持久,否则添加异常(warn: Jobs added with no trigger must be durable. ),必须在添加之前给作业绑定触发器、或者把作业设置成持久的storeDurably()
  • 任务参数JobDataMap,在持久化时也会持久化
  • 如果Job类中提供了setXxx(xx)方法,而且构造JobDetail时JobDataMap存在key=xxx,那会在构造过程中将会注入到任务类本身的setXxx();
  • context中的dataMap是合并之后的map,JobDataMap dataMap = context.getMergedJobDataMap(); 这是JobDetail.JobDataMap和Trigger.JobDataMap的合并,相同key的情况下后者覆盖前者。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值