基础概念及常用cron
基础概念
Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征,如:数据库支持,集群,插件,EJB 作业预构 建,JavaMail 及其它,支持 cron-like 表达式等等
常用组件
Scheduler | 调度器是quartz的核心,quartz通过这个容器来实现触发器和任务的绑定以及执行,代表一个Quartz的独立运行容器。Trigger和JobDetail可以注册到Scheduler中,Scheduler可以将Trigger绑定到某一JobDetail上,这样当Trigger被触发时,对应的Job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。 |
---|---|
Job | 是一个接口,有一个方法 void execute(JobExecutionContext context) ,可以通过实现该接口来定义需要执行的任务 |
JobKey | 表示job实例的标识,触发器被触发时,该指定的job实例会被执行 |
JobDetail | Quartz每次执行Job时,都重新创建一个Job实例,会接收一个Job实现类,以便运行的时候通过newInstance()的反射调用机制去实例化Job。JobDetail是用来描述Job实现类以及相关静态信息,比如任务在scheduler中的组名等信息 |
Trigger | 描述触发Job执行的时间触发规则实现类SimpleTrigger和CronTrigger可以通过crom表达式定义出各种复杂的调度方案 |
Calendar | 是一些日历特定时间的集合。一个Trigger可以和多个 calendar关联,比如每周一早上10:00执行任务,法定假日不执行,则可以通过calendar进行定点排除 |
JobDataMap | 可以包含不限量的(序列化的)数据对象,在job实例执行的时候,可以使用其中的数据;jobDataMap是java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法 |
JobBuilder | 用于声明一个任务实例,也可以定义关于该任务的详情比如任务名、组名等,这个1声明的实例将会作为一个实际执行的任务 |
TriggerBuilder | 触发器创建器,用于创建触发器trigger实例 |
JobListener | 对Job的监听组件 |
TriggerListener | 对Trgigger的监听组件 |
SchedulerListener | 对Scheduler的监听组件 |
misfire关键字
表示任务到了触发时间,但是任务却没有被触发
可能的原因
- 使用了@DisallowConcurrentExecution注解,而且任务的执行时间>任务间隔
- 线程池满了,没有资源执行任务
- 机器宕机或者人为停止,过段时间恢复运行
Cron表达式
基本规则
格式: [秒] [分] [时] [日] [月] [周] [年] | |||
---|---|---|---|
类型 | 是否必填 | 允许填写的值 | 允许的通配符 |
秒 | Y | 0-59 | ,-*/ |
分 | Y | 0-59 | ,-*/ |
时 | Y | 0-23 | ,-*/ |
日 | Y | 1-31 | ,-*/?LW |
月 | Y | 1-12 or JAN-DEC | ,-*/ |
周 | Y | 1-7 or SUN-SAT | ,-*/?L# |
年 | N | 空 or 1970-2099 | ,-*/ |
常用表达式
cron | 说明 |
---|---|
0 0 12 * * ? | 每天12点触发 |
0 15 10 ? * * | 每天10点15分触发 |
0 15 10 * * ? | 每天10点15分触发 |
0 15 10 * * ? * | 每天10点15分触发 |
0 15 10 * * ? 2005 | 2005年每天10点15分触发 |
0 * 14 * * ? | 每天下午的2点到2点59分每分触发 |
0 0/5 14 * * ? | 每天下午的2点到2点59分(整点开始,每隔5分触发) |
0 0/5 14,18 * * ? | 每天下午的2点到2点59分(整点开始,每隔5分触发) 每天下午的18点到18点59分(整点开始,每隔5分触发) |
0 0-5 14 * * ? | 每天下午的2点到2点05分每分触发 |
0 10,44 14 ? 3 WED | 3月份每周三下午的2点10分和2点44分触发 |
0 15 10 ? * MON-FRI | 周一到周五每天上午的10点15分触发 |
0 15 10 15 * ? | 每月15号上午10点15分触发 |
0 15 10 L * ? | 每月最后一天的10点15分触发 |
0 15 10 ? * 6L | 每月最后一周的星期五的10点15分触发 |
0 15 10 ? * 6L 2002-2005 | 从2002年到2005年每月最后一周的星期五的10点15分触发 |
0 15 10 ? * 6#3 | 每月第三周星期五的10点15分触发 |
0 0 12 1/5 * ? | 每月的第一个中午12点开始每隔5天触发一次 |
0 11 11 11 11 ? | 每年的11月11号11点11分触发 |