gpt4 book ai didi

java - quartz : preventing concurrent instances of a job in jobs. xml

转载 作者:IT老高 更新时间:2023-10-28 20:41:57 26 4
gpt4 key购买 nike

这应该很容易。我正在使用在 Apache Tomcat 6.0.18 下运行的 Quartz,并且我有一个 jobs.xml file它设置了我每分钟运行一次的计划作业。

我想做的是,如果下一个触发时间到来时作业仍在运行,我不想开始新作业,所以我可以让旧实例完成。

有没有办法在jobs.xml中指定这个(防止并发实例)?

如果没有,我是否可以在我的应用程序的 Job 中共享对内存中单例的访问权限?实现(这是通过JobExecutionContext 吗?)所以我可以自己处理并发? (并检测之前的实例是否正在运行)


更新:在文档中苦苦挣扎之后,我正在考虑以下几种方法,但要么不知道如何让它们工作,要么存在问题。

  1. 使用StatefulJob .这可以防止并发访问......但我不确定如果我使用它会发生什么其他副作用,我也想避免以下情况:

    假设触发时间是每分钟,即触发器#0 = 在时间 0,触发器 #1 = 60000 毫秒,#2 = 120000,#3 = 180000 等,并且触发器#0 在时间 0 触发我的工作需要 130000 毫秒。对于普通作业,这将在作业触发器 #0 仍在运行时执行触发器 #1 和 #2。使用 StatefulJob,这将在 #0 在 130000 完成后立即按顺序执行触发器 #1 和 #2。我不希望这样,我希望 #1 和 #2 不运行,并且运行作业的下一个触发器应该发生在#3 (180000msec)。所以我仍然需要对 StatefulJob 做一些其他事情才能让它按照我想要的方式工作,所以我看不出使用它有什么好处。

  2. 使用 TriggerListener从 vetoJobExecution() 返回 true。

    虽然实现接口(interface)看起来很简单,但我必须弄清楚如何以声明方式设置 TriggerListener 的一个实例。 Can't find the docs for the xml file .

  3. 使用 static我的实现 Job 的类拥有的共享线程安全对象(例如信号量或其他)。

    我不喜欢通过 static 使用单例的想法Tomcat/Quartz 下的关键字,不知道有没有副作用。此外,我真的不希望他们成为真正的单例,只是与特定工作定义相关联的东西。

  4. 实现我自己的Trigger扩展 SimpleTrigger并包含可以运行自己的 TriggerListener 的共享状态。

    同样,我不知道如何设置 XML 文件以使用此触发器而不是标准 <trigger><simple>...</simple></trigger> .

最佳答案

还有另一个更简单的解决方案。可以为作业提供 DisallowConcurrentExecution 注释,以防止多个并发实例运行。参见文档 here .

链接不断断开,因此这里是相关示例。

@DisallowConcurrentExecution
public class ColorJob implements Job {

关于java - quartz : preventing concurrent instances of a job in jobs. xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2676295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com