Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Quartz: skipping duplicate job fires scheduled with same fire time

I'm new to Quartz and stuck on duplicate job runs. They was caused by two triggers which has overlapping fire times.

Is there any Quartz "out-of-the-box" functionality which will prevent duplicate fires of same job with multiple attached triggers?

Or maybe there is some third-party Trigger implementation which allows to combine schedule's with proper fire time calculation which will prevent duplicate fire times?

Or maybe i can somehow combine multiple schedules?

Any solution will be greatly appreciated.

Thanks

For the clarity:

public static class MyJob implements Job {
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("My Job at " + DateUtils.toDateTimeString(context.getFireTime()) +  " by " +
                context.getTrigger().getKey().getName());
    }
}

startScheduler() {

    final Set<Trigger> triggers = new HashSet<Trigger>();
    triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 3 secs").
            withSchedule(CronScheduleBuilder.cronSchedule("0/3 * * * * ? *")).build());
    triggers.add(TriggerBuilder.<CronScheduleBuilder>newTrigger().withIdentity("every 2 secs").
            withSchedule(CronScheduleBuilder.cronSchedule("0/2 * * * * ? *")).build());

    final Scheduler scheduler = new StdSchedulerFactory(properties).getScheduler();
    scheduler.scheduleJob(JobBuilder.newJob(MyJob.class).build(), triggers, false);
    scheduler.start();

}

And the logs:

  • My Job at 01.11.2013T23:19:26.000 by every 2 secs
  • My Job at 01.11.2013T23:19:27.000 by every 3 secs
  • My Job at 01.11.2013T23:19:28.000 by every 2 secs
  • My Job at 01.11.2013T23:19:30.000 by every 2 secs
  • My Job at 01.11.2013T23:19:30.001 by every 3 secs
  • My Job at 01.11.2013T23:19:32.000 by every 2 secs
  • My Job at 01.11.2013T23:19:33.000 by every 3 secs
  • My Job at 01.11.2013T23:19:34.000 by every 2 secs
  • My Job at 01.11.2013T23:19:36.000 by every 2 secs
  • My Job at 01.11.2013T23:19:36.001 by every 3 secs
  • My Job at 01.11.2013T23:19:38.000 by every 2 secs
  • My Job at 01.11.2013T23:19:39.000 by every 3 secs
  • My Job at 01.11.2013T23:19:40.000 by every 2 secs
  • My Job at 01.11.2013T23:19:42.001 by every 2 secs
  • My Job at 01.11.2013T23:19:42.002 by every 3 secs
like image 692
acc15 Avatar asked Jan 27 '26 03:01

acc15


1 Answers

Found that TriggerListener's suitable for this task:

scheduler.getListenerManager().addTriggerListener(new TriggerListener() {

    private Date lastFireTime = null;

    @Override
    public String getName() {
        return "prevent-duplicate-fires";
    }

    @Override
    public void triggerFired(Trigger trigger, JobExecutionContext context) {
    }

    @Override
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {
        final Date fireTime = context.getScheduledFireTime();
        if (lastFireTime != null && fireTime.equals(lastFireTime)) {
            return true;
        }
        lastFireTime = fireTime;
        return false;
    }

    @Override
    public void triggerMisfired(Trigger trigger) {
    }

    @Override
    public void triggerComplete(Trigger trigger, JobExecutionContext context, Trigger.CompletedExecutionInstruction triggerInstructionCode) {
    }
});

Looks like it works:

  • My Job at 01.11.2013T23:46:14.000 by every 2 secs
  • My Job at 01.11.2013T23:46:15.000 by every 3 secs
  • My Job at 01.11.2013T23:46:16.000 by every 2 secs
  • My Job at 01.11.2013T23:46:18.000 by every 2 secs
  • ---> Should fire but skipped - My Job at 01.11.2013T23:46:18.000 by every 3 secs
  • My Job at 01.11.2013T23:46:20.000 by every 2 secs
  • My Job at 01.11.2013T23:46:21.000 by every 3 secs
  • My Job at 01.11.2013T23:46:22.000 by every 2 secs
  • My Job at 01.11.2013T23:46:24.000 by every 2 secs
  • ---> Should fire but skipped - My Job at 01.11.2013T23:46:24.000 by every 3 secs
  • My Job at 01.11.2013T23:46:26.000 by every 2 secs
  • My Job at 01.11.2013T23:46:27.000 by every 3 secs
like image 100
acc15 Avatar answered Jan 29 '26 17:01

acc15



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!