3.6 Job Execution(任务执行)
•任务是任何实现简单Job接口的Java 类,这样开发者能够执行任何完成他们工作的任务。
•任务类的实例可以由Quartz实例化,也可以由你的程序框架实例化。
当触发器被触发时,日程管理器将会通知某个或者多个实现了JobListener 或TriggerListener的对象(监听器可以是简单的Java对象,或者EJBs,或者JMS消息发布器,等等)。这些监听器在任务执行完毕后也会接到通知。
•任务被完成后,他们会返回一个“任务完成码(JobCompletionCode)”,这个“任务完成码”告知日程管理器任务执行的结果是成功还是失败。日程管理器会根据成功或者失败码来采取措施,比如:立即重新执行任务。
3.7 Job Persistence(任务持久化)
• Quartz设计中包括了一个JobStore接口,这样,实现这个接口的Job类可以以多种机制实现Job的存储。
•通过使用JDBCJobStore,所有的Jobs和Triggers被配置为“non-volatile”(不轻快)的方式。即,通过JDBC存储在关系数据库中。
•通过使用RAMJobStore,所有Jobs和Triggers被存储在RAM。因此,在程序执行中没有被持久化,但这种方式的优点就是不需要外部数据库。
3.8 Transactions(事务)
• Quartz通过JobStoreCMT(JDBCJobStore的一个子类)可参与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 总是在给定的时间出发然后计算它下次触发的时间。如果在给定的日期内没有该时间,则触发器将会被忽略,如果在给定的日期内该时间发生了两次,它只触发一次。因为是在第一次触发发生后计算当天下次触发的时间。