1

我的目标是创建一个队列系统,我可以在其中为每个组指定最大数量的并发作业,即对于 A 组,最多 3 个作业应该同时运行,对于 B 组,最多 Y 个作业等。这些作业可以同时执行在 cron 计划上并且仅使用 SimpleTrigger 一次,因此在调度作业时我无法检查队列,我必须在执行之前或期间检查它。我正在实现一个作业监听器,并试图阻止在 jobToBeExecuted() 方法中执行。我试过 scheduler.interrupt() 但是当工作还没有开始时它不起作用。scheduler.deletejob() 和 scheduler.unschedule() 也没有阻止它执行。

有任何想法吗?

public class JobQueueListener implements JobListener {

@Override
public void jobToBeExecuted(JobExecutionContext context) {
     JobKey currentJobKey = context.getJobDetail().getKey();
     JobDetail jobDetail = context.getJobDetail();
     Scheduler scheduler = context.getScheduler();

     if (shouldBePutInQueue(currentJobKey)) {
          /// Prevent execution and put in queue here, but how?
     }
}

@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
       //Check queue and execute next in queue
}

}
4

1 回答 1

2

你能看看 TriggerListener吗

您应该实现 TriggerListener 并在“vetoJobExecution”方法中使用您的中止逻辑。

boolean vetoJobExecution(Trigger trigger,
                     JobExecutionContext context)

它在触发触发器时由调度程序调用,并且其关联的 JobDetail 即将执行。如果实现否决执行(通过返回 true),则不会调用作业的执行方法。

于 2017-01-13T23:59:39.220 回答