gpt4 book ai didi

java - Quartz @DisallowConcurrentExecution 允许类的多个实例运行但不允许作业?

转载 作者:行者123 更新时间:2023-11-30 11:43:37 24 4
gpt4 key购买 nike

我一直在研究一个调度引擎,它从数据库中读取计划作业并安排它们工作正常,但是数据库中的行只是某些类型作业的“配置”,例如:

获取FTP的一定配置有

host: imagineryHost1.com 
post: 22

和另一个同类的有

host: imagineryHost2.com
post: 21

我们创建了两个 FPTjob,它们都有自己的触发器和各自独立的数据。

/**
BaseJob is an Abstract class extending QuartzJobBean used to handle our logging and
other requirements that need across all our jobs.
*/
public class FTPJob extends BaseJob {

/**
Called from executeInternal of QuartzJobBean
*/
@Override
public boolean execute1V(JobExecutionContext context) {
//Code to get Files from FTP.
}
}

这些是使用带有 cron 的 TriggerBuilder 安排的。

如果我添加 @DisallowConcurrentExecution 将只允许我们的 FTPJob 的 1 个实例在任何时候运行,但是我需要能够运行 FTPJob 的多个实例但将其限制为该特定配置的仅一个实例类。

任何有关如何取得进展的线索都将受到高度赞赏:)

更新

根据 ftom2 的回答,我深入挖掘并找到了 TriggerListener,因为每个作业配置都有自己的 uniqueID,所以我可以“否决”运行 ie 的作业。

public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
try {
Iterator<JobExecutionContext> it =
context.getScheduler().getCurrentlyExecutingJobs().iterator();

boolean found = false;
while(it.hasNext()) {
JobExecutionContext job = it.next();

if(trigger.getJobKey().equals(job.getJobDetail().getKey())) {
return false;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}

有没有其他更内置的方法来处理这个问题?

最佳答案

我不确定这是否可能,但这可能是一个方向。

您可以实现 JobListener然后执行以下操作:

  1. 使用 jobWasExecuted,您将在 jobDetails 中设置一个标志,表明该作业已完成。
  2. 使用 jobToBeExecuted,您将在作业开始前检查作业状态,看看它是否处于运行状态,如果是 - 停止它(参见 here),如果不是 - 让它运行并将其状态设置为运行。<

希望这对您有所帮助。

关于java - Quartz @DisallowConcurrentExecution 允许类的多个实例运行但不允许作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11223370/

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