定时任务Java编写综述之Quartz理论(3)

3.6 Job Execution(任务执行)

任务是任何实现简单Job接口的Java 类,这样开发者能够执行任何完成他们工作的任务。

任务类的实例可以由Quartz实例化,也可以由你的程序框架实例化。

当触发器被触发时,日程管理器将会通知某个或者多个实现了JobListener TriggerListener的对象(监听器可以是简单的Java对象,或者EJBs,或者JMS消息发布器,等等)。这些监听器在任务执行完毕后也会接到通知。

任务被完成后,他们会返回一个“任务完成码(JobCompletionCode)”,这个“任务完成码”告知日程管理器任务执行的结果是成功还是失败。日程管理器会根据成功或者失败码来采取措施,比如:立即重新执行任务。

 

3.7 Job Persistence(任务持久化)

Quartz设计中包括了一个JobStore接口,这样,实现这个接口的Job类可以以多种机制实现Job的存储。

通过使用JDBCJobStore,所有的JobsTriggers被配置为“non-volatile(不轻快)的方式。即,通过JDBC存储在关系数据库中。

通过使用RAMJobStore,所有JobsTriggers被存储在RAM。因此,在程序执行中没有被持久化,但这种方式的优点就是不需要外部数据库。

 

3.8 Transactions(事务)

Quartz通过JobStoreCMTJDBCJobStore的一个子类)可参与JTA事务。

Quartz可以管理JTA事务(开始或者提交事务)。

 

3.9 Clustering(集群)

Fail-over.(容错)

Load balancing.(负载均衡)

 

3.10 Listeners &Plug-Ins(监听器及插件)

应用可以通过实现一个或者多个监听器接口来实现捕捉日程事件,以监视或控制任务/触发器的行为。

可以通过插件的机制来扩展Quartz 的功能。例如:记录任务执行历史的日志,或者从文件中载入任务和触发器的定义。

 

3.11 夏令时和触发器

CronTrigger SimpleTrigger分别用它们自己的方式来处理夏令时,每种方式对与触发器类型来说都很直观。

(夏令时开始的时刻,时钟要向前(未来)拨一个小时,夏令时结束的时刻,时钟向后(过去)拨一个小时)

SimpleTrigger允许你每隔若干毫秒来触发纳入进度的任务。因此,对于夏令时来说,根本不需要做任何特殊的处理来“保持进度”。它只是简单地保持每隔若干毫秒来触发一次,无论你的SimpleTrigger每隔10秒触发一次还是每隔15分钟触发一次,还是每隔24小时触发一次。但是这隐含了一个混乱,对于那些每隔12个小时触发一次的SimpleTrigger来说,在实行夏令时之前,任务是在凌晨3点及下午3点触发,但是在执行夏令时后,人物是在凌晨4点及下午4点触发。这不是Bug,触发器仍然保持了每隔若干毫秒触发一次,只是时间的“名字”被人为地强行改变了。

CronTrigger能在特定“格林日历”时刻触发纳入进程的任务,因此,如果创建一个在每天上午10点触发的触发器,那么,在夏令时执行之前,系统将继续如此运作。但是,取决于是春季还是秋季夏令时,因为对于特定的星期日,从星期六上午10点到星期日上午10点之间的时间间隔将不是24小时,而可能是23或者25个小时。

总之,如果你记住下面的两条规则,则会感觉良好并且很容易记忆:

SimpleTrigger 总是每隔若干秒触发,而同夏令时没有关系。

 

CronTrigger 总是在给定的时间出发然后计算它下次触发的时间。如果在给定的日期内没有该时间,则触发器将会被忽略,如果在给定的日期内该时间发生了两次,它只触发一次。因为是在第一次触发发生后计算当天下次触发的时间。

 

 

猜你喜欢

转载自aoyouzi.iteye.com/blog/1861117