如何避免一个 Job 被并发激活?
使 Job 类实现 StatefulJob 接口,而不是 Job 接口。阅读 JavaDOC 获得有关
StatefulJob 接口的更多信息。
如何停止一个正在执行的任务?
参见org.quartz.InterruptableJob接口和Scheduler.interrupt(String, String)
方法。
Questions About Triggers
如何串行任务的执行?或者,如何能够创建一个工作流程。
目前 Quartz 没有“直接”或者“便捷”的方法能够串行触发器。但是有几种方法可
以完成这些工作而不需要太多的工作。下面是这些方法的介绍:
一个方法就是使用监听器(例如:TriggerListener,JobListener 或者
SchedulerListener)来通知任务/触发器的执行完成,并且立即触发新的触发器。这个方
法会有一些小麻烦,因为你不得不通知接下来要执行任务的监听器,并且你可能会担心这
个信息的持久化问题。
另一个方法就是建立一个任务,这个任务将下一个要执行任务的名字放在这个任务的
JobDataMap 中,当这个任务完成时(它的 exceute()方法中的最后一步)就会产生执行
下一个任务的日程安排。有些人使用这个方法并且取得成功。大多数创建一个(虚)基类,
在这个类中,一个任务知道如何通过特定的键来获得 JobDataMap 以外的任务名和组,
并且包含了将已识别的任务纳入日程的代码,然后,简单地扩展这个类使其包含任务需要
做的附加工作。
在将来,Quartz 将提供一个非常明确的方法去完成这些功能,但目前为止,你只能
使用以上这些方法中的一种,或者考虑更适合你的方法。
为什么触发器没有被触发?
最常见的原因就是没有调用Scheduler.start()
,这个方法告知
scheduler开始触发触
发器。
另外一个常见的原因就是触发器或者触发器组被暂停了。
夏令时和触发器
CronTrigger 和 SimpleTrigger 分别用它们自己的方式来处理夏令时,每种方式
对与触发器类型来说都很直观。