2016-12-06 71 views
0

我的目标是创建一个队列系统,我可以为每个组指定最大并发作业数量,即对于组A,最多3个作业应该同时运行,对于组B max Y工作等等。作业可以在cron时间表上执行,并且只能用SimpleTrigger执行一次,因此在安排作业时我不能检查队列,我必须在执行前或执行期间检查它。我正在实现一个joblistener,我试图阻止jobToBeExecuted()方法中的执行。我试过了scheduler.interrupt(),但是当作业尚未开始时它就不起作用。 scheduler.deletejob()和scheduler.unschedule()并没有阻止它执行。石英防止作业执行jobToBeExecuted

任何想法?

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 
} 

} 

回答

1

你可以看一下TriggerListener

你应该实现TriggerListener和具有内 “vetoJobExecution” 的方法您中止逻辑。由调度器调用

boolean vetoJobExecution(Trigger trigger, 
        JobExecutionContext context) 

它当触发器已被触发,它的相关的JobDetail即将被执行。如果执行通过执行(通过返回true),则不会调用作业的执行方法。

+0

谢谢,正是我想要的! – Johan