How to prevent Quartz from re-firing a job while it is still running

Answer: use @DisallowConcurrentExecution

Example

Without this annotation


import java.time.LocalTime;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class HelloJob implements Job {


    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

        System.out.println(Thread.currentThread().getName() +  ":Job started at " + LocalTime.now());
        try {
            Thread.sleep(10 * 1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println(Thread.currentThread().getName() + ":Job done at " + LocalTime.now());

    }
}

import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

public class DisallowConcurrentExecutionExample {

    public static void main(String[] args) throws Exception {

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        scheduler.start();


        JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("helloJob", "anyGroup").build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("helloTrigger", "anyGroup")
                                        .withSchedule(simpleSchedule()
                                        .withIntervalInSeconds(5) //re-fire every five minutes
                                        .withRepeatCount(2))  //so with the first invocation together there will be 3 times
                                        .startNow().build();

        scheduler.scheduleJob(job, trigger);
    }
}

And the output will be


LearnQuartz_Worker-1:Job started at 18:31:28.296
LearnQuartz_Worker-2:Job started at 18:31:33.275   #the first run hasn't been finished yet! 
LearnQuartz_Worker-3:Job started at 18:31:38.275
LearnQuartz_Worker-1:Job done at 18:31:38.353
LearnQuartz_Worker-2:Job done at 18:31:43.275
LearnQuartz_Worker-3:Job done at 18:31:48.275

Now if you put @DisallowConcurrentExecution to HelloJob class, the output will be like,

LearnQuartz_Worker-1:Job started at 18:34:44.665
LearnQuartz_Worker-1:Job done at 18:34:54.723
LearnQuartz_Worker-2:Job started at 18:34:54.726 #On hold until the first run has finished
LearnQuartz_Worker-2:Job done at 18:35:04.726
LearnQuartz_Worker-3:Job started at 18:35:04.727
LearnQuartz_Worker-3:Job done at 18:35:14.727

That’s what we want.

Leave a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.