在Quartz调度程序中使用@DisallowConcurrentExecution

问题描述 投票:0回答:1

我很抱歉,如果这个问题太天真了,我期待安排这些工作,以便逐个执行,而不是平行执行。它只执行一次。

从docs,@ DisallowConcurrentExecution是

  • 一个注释,将{@link Job}类标记为一个不能同时执行多个实例的注释(实例基于{@link JobDetail}定义 - 或者换言之,基于{@link JobKey})。

但是当我安排一份同样的JobKey工作时,我会得到Failed to schedule a job org.quartz.ObjectAlreadyExistsException

如果我生成一个不同的JobKey,它不会注意到@DisallowConcurrentExecution并且该作业正在并行执行(如文档中所述)。

请建议我如何实现这一点,任何指针都会有所帮助!

PS:我不知道将安排的工作。因此,如果作业已在运行,我需要一些方法来动态链接作业。

java quartz-scheduler
1个回答
2
投票

同样的JobKey =同样的工作。 不同的JobKey =不同的工作。

Quartz不会让你多次使用相同的JobKey,因为这是两个具有相同键的作业。就像拥有两个具有相同ID的用户一样。

你需要做的是为同一个JobTrigger安排不同的JobKeys。

@DisallowConcurrentExecution避免重复执行相同的工作。如果你使用不同的JobKey,它不再是同一个工作,所以注释没有任何影响。但是对于给定JobKey和几个JobTriggers,@DisallowConcurrentExecution将阻止触发器启动新的执行工作,如果前一个尚未完成。

我建议看看Quartz's documentation,以便更深入地了解上述概念。


推荐问答