quartz定时器工具

原创
2015/03/13 13:52
阅读数 1.5K

一次工作的时候有用到。正好把之前做的一些记录也贴出了做个总结好了。

1.quartz核心接口

Scheduler 调度器、Job、JobDetail、Trigger、JobDataMap


2.Scheduler 

1.这个 Scheduler 的实现,实际上是一个代理,对其中方法调用会传递到 QuartzScheduler 实例上
2.SchedulerFactory实例化
3.org.quartz.impl.DirectoSchedulerFactory  
  org.quartz.impl.StdSchedulerFactory
StdSchedulerFactory会加载类路径下的quartz.properties 文件
4.一旦scheduler被关闭(shutdown),则它不能再重新启动,除非重新实例化它


3.job

1.public interface Job { void execute(JobExecutionContext context) throws JobExecutionException; }
2.StatefulJob在任务的每次执行之后重新存储JobDataMap

4.JobDetail

1.JobDetail对象由Quartz客户端在Job被加入到scheduler时创建。它包含了Job的各种设置属性以及一个JobDataMap对象,这个对象被用来存储给定Job类实例的状态信息。

2.每次scheduler执行这个任务时,它就创建这个类的新实例,然后调用该实例的execute(..)方法。

3.JobDataMap
JobDetail.getJobDataMap().put("jobSays", "Hello World!"); 
JobExecutionContext.getJobDetail().getJobDataMap(); 
Trigger.getJobDataMap();
JobExecutionContext.getMergedJobDataMap(); 

5.Trigger

1.Trigger对象被用来触发jobs的执行。

2.常用的Trigger类是SimpleTrigger和CronTrigger。

3.SimpleTrigger
SimpleTrigger用来触发只需执行一次或者在给定时间触发并且重复N次且每次执行延迟一定时间的任务。

4.CronTriggers
像日历那样按日程来触发任务

5.TriggerUtils
提供了许多便捷的方法简化了构造和配置 trigger
public static Trigger makeSecondlyTrigger(int intervalInSeconds);
public static Trigger makeDailyTrigger(int hour, int minute);
public static Trigger makeWeeklyTrigger(int dayOfWeek, int hour, int minute);
public static Trigger makeMonthlyTrigger(int dayOfMonth, int hour, int minute);
public static Date getNextGivenMinuteDate(Date date, int minuteBase);
public static Date getEvenMinuteDate(Date date);

6.Listeners

1.TriggerListeners和JobListeners 
监听器是在scheduler事件发生时能够执行动作的对象。
TriggerListeners接收与triggers相关的事件
JobListeners则接收与Job相关的事件。

2.注册
监听器然后在执行的时候注册到scheduler
听器可以被注册为“全局”的或者“非全局”

全局:scheduler.addGlobalJobListener(jobListener);   

非全局scheduler.addJobListener(jobListener);    
 jobDetail.addJobListener(jobListener.getName());  

3.SchedulerListeners
只接收与特定trigger 或job无关的Scheduler自身事件通知

4.jobListener的方法:
jobToBeExecuted() 方法

Scheduler 在 JobDetail 将要被执行时调用这个方法。

·jobExecutionVetoed() 方法

Scheduler 在 JobDetail 即将被执行,但又被 TriggerListener 否决了时调用这个方法。

·jobWasExecuted() 方法

Scheduler 在 JobDetail 被执行之后调用这个方法。

5.TriggerListener
·getName() 方法

和前面的 JobListener 一样,TriggerListner 接口的 getName() 返回一个字符串用以说明监听器的名称。对于非全局的 TriggerListener,在 addTriggerListener() 方法中给定的名称必须与监听器的 getName() 方法返回值相匹配。

·triggerFired() 方法

当与监听器相关联的 Trigger 被触发,Job 上的 execute() 方法将要被执行时,Scheduler 就调用这个方法。在全局 TriggerListener 情况下,这个方法为所有 Trigger 被调用。

·vetoJobExecution() 方法

在 Trigger 触发后,Job 将要被执行时由 Scheduler 调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true,这个 Job 将不会为此次 Trigger 触发而得到执行。

·triggerMisfired() 方法

Scheduler 调用这个方法是在 Trigger 错过触发时。如这个方法的 JavaDoc 所指出的,你应该关注此方法中持续时间长的逻辑:在出现许多错过触发的 Trigger 时,长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。

·triggerComplete() 方法

Trigger 被触发并且完成了 Job 的执行时,Scheduler 调用这个方法。这不是说这个 Trigger 将不再触发了,而仅仅是当前 Trigger 的触发(并且紧接着的 Job 执行) 结束时。这个 Trigger 也许还要在将来触发多次的。

7.SchedulerPlugin插件

1.Quartz提供了一个接口(org.quartz.spi.SchedulerPlugin)来插入附加的功能。

2.public interface SchedulerPlugin {
 public void initialize(String name, Scheduler scheduler) throws SchedulerException;
 public void start();
 public void shutdown();
}

8.Quartz cron 

1.
表 5.1. Quartz Cron 表达式支持到七个域
名称 是否必须 允许值 特殊字符
0-59 , - * /
0-59 , - * /
0-23 , - * /
1-31 , - * ? / L W C
1-12 或 JAN-DEC , - * /
1-7 或 SUN-SAT , - * ? / L C #
空 或 1970-2099 , - * /

2.星号

使用星号(*) 指示着你想在这个域上包含所有合法的值。例如,在月份域上使用星号意味着每个月都会触发这个 trigger。

3.问号

? 号只能用在周域上,但是不能在这两个域上同时使用。你可以认为 ? 字符是 "我并不关心在该域上是什么值。" 这不同于星号,星号是指示着该域上的每一个值。? 是说不为该域指定值。

4., 逗号

逗号 (,) 是用来在给某个域上指定一个值列表的。例如,使用值 0,15,30,45 在秒域上意味着每15秒触发一个 trigger。

5./ 斜杠

斜杠 (/) 是用于时间表的递增的。我们刚刚用了逗号来表示每15分钟的递增,但是我们也能写成这样 0/15

6.- 中划线

中划线 (-) 用于指定一个范围。例如,在小时域上的 3-8 意味着 "3,4,5,6,7 和 8 点。"  域的值不允许回卷,所以像 50-10 这样的值是不允许的。

7.L 说明了某域上允许的最后一个值。它仅被域支持。当用在日域上,表示的是在域上指定的月份的最后一天。例如,当月域上指定了 JAN 时,在域上的 L 会促使 trigger 在1月31号被触发。

8.W 字母

W 字符代表着平日 (Mon-Fri),并且仅能用于日域中。它用来指定离指定日的最近的一个平日

9.# 井号

# 字符仅能用于域中。它用于指定月份中的第几周的哪一天。例如,如果你指定周域的值为 6#3,它意思是某月的第三个周五 (6=星期五,#3意味着月份中的第三周)。








展开阅读全文
加载中

作者的其它热门文章

打赏
0
10 收藏
分享
打赏
0 评论
10 收藏
0
分享
返回顶部
顶部