我想做的是,如果作业在下一个触发时间到达时仍在运行,则不希望启动新作业,以便让旧实例完成。
在jobs.xml中是否有一种指定此项(防止并发实例)的方法?
如果没有,是否有一种方法可以在我的应用程序的Job实现内共享对内存单例的访问(通过JobExecutionContext实现?),以便我可以自己处理并发?(并检测先前的实例是否正在运行)
更新: 在文档中摸索了一番后,我考虑了几种方法,但要么不知道如何使它们工作,要么存在问题。
使用StatefulJob。这可以防止并发访问...但我不确定如果使用它会有什么其他副作用,而且我想避免以下情况:
假设触发时间为每分钟一次,即触发器#0 = 时间0,触发器#1 = 60000毫秒,#2 = 120000,#3 = 180000,等等。触发器#0在时间0时触发我的工作,需要130000毫秒。对于普通的Job,这将在作业触发器#0仍在运行时执行触发器#1和#2。对于StatefulJob,这将在#0在130000结束时立即按顺序执行触发器#1和#2。我不想要那样,我希望#1和#2不要运行,并且下一个运行作业的触发器应该在#3(180000毫秒)处发生。因此,我仍然需要对StatefulJob进行其他处理,使其按照我想要的方式工作,所以我不认为使用它有多大优势。
使用TriggerListener来从vetoJobExecution()中返回true。
虽然实现接口似乎很简单,但我必须弄清楚如何声明性地设置TriggerListener的一个实例。找不到xml文件的文档。
使用
static
共享线程安全对象(例如信号量或其他)由实现Job的类拥有。我不喜欢在Tomcat/Quartz下使用
static
关键字来使用单例,不确定是否有副作用。而且我真的不想让它们成为真正的单例,只是与特定作业定义相关联的东西。实现自己的Trigger,它扩展SimpleTrigger并包含可以运行自己的TriggerListener的共享状态。
同样,我不知道如何设置XML文件以使用此触发器而不是标准的
<trigger><simple>...</simple></trigger>
。