Ensure that Spring Quartz job execution doesn't overlap

java, quartz-scheduler, spring, synchronization

Solution

If all you need to do is fire every 20 seconds, Quartz is serious overkill. The `java.util.concurrent.ScheduledExecutorService` should be perfectly sufficient for that job.

The `ScheduledExecutorService` also provides two semantics for scheduling. "fixed rate" will attempt to run your job every 20 seconds regardless of overlap, whereas "fixed delay" will attempt to leave 20 seconds between the end of the first job and the start of the next. If you want to avoid overlap, then fixed-delay is safest.

Problem

I have a Java program that executes from Spring Qquartz every 20 seconds. Sometimes it takes just few seconds to execute, but as data gets bigger I'm sure it run for 20 seconds or more. How can I prevent Quartz from firing/triggering the job while one instance is still being executed? Firing 2 jobs performing same operations on a database would not be so good. Is there a way I can do some kind of synchronization?

Original source