我一直在研究一个调度引擎,它从数据库中读取调度作业并安排它们工作正常但是数据库中的行只是某些类型作业的“配置”,例如:
获取 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,所以我可以“否决”运行作业,即。
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();
}
}
有没有其他更内置的方法来处理这个问题?