简体   繁体   中英

Quartz prevent job execution on jobToBeExecuted

My aim is to create a queue system where I can specify a maximum amount of concurrent jobs for each group, ie for group A maximum 3 jobs should run at the same time, for group B max Y jobs etc. The jobs can be executed both on cron schedule and only once with SimpleTrigger, therefor I can't check the queue when scheduling the job, I have to check it before or during execution. I'm implementing a joblistener and I'm trying to prevent execution in the jobToBeExecuted() method. I've tried scheduler.interrupt() but it doesn't work when the job hasn't started yet. scheduler.deletejob() and scheduler.unschedule() didn't stop it from executing either.

Any ideas?

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
}

}

Can you look at TriggerListener

You should implement TriggerListener and have your abort logic within "vetoJobExecution" method.

boolean vetoJobExecution(Trigger trigger,
                     JobExecutionContext context)

Its Called by the Scheduler when a Trigger has fired, and it's associated JobDetail is about to be executed. If the implementation vetos the execution (via returning true), the job's execute method will not be called.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM