AnonyMouse
AnonyMouse

Reputation: 442

Quartz Scheduler (.Net) - Why is the job fired immediately after built-in 'RescheduleJob' method is run?

When I run a job using Quartz I log the details to a table in my database, and I can see that when I run a job manually, or have scheduled a job, the table gets populated with the job details at the correct time.

However, when I reschedule a job using the built-in RescheduleJob method, the job is fired twice; once when I run the method, and then correctly, at the time the job was rescheduled to.

Example:

Rescheduled Job to 09:01:11, but the job was inserted into the database twice, at:

09:00:23 (seconds after calling RescheduleJob method)

09:01:11 (the rescheduled time)

I've looked through my code and there's nothing calling the job before getting to the RescheduleJob method.

public void RescheduleTrigger(TriggerKey key, string cronexpression)
{
 var trigger = this.GetTrigger(key);
 var triggerBuilder = trigger.GetTriggerBuilder();
 ITrigger newTrigger = triggerBuilder.WithCronSchedule(cronexpression).Build();

 this.scheduler.RescheduleJob(trigger.Key, newTrigger);
}

I've Googled around and I've only found one similar case and it was unresolved. Has anyone encountered this before and can help me work around it?

Upvotes: 4

Views: 2554

Answers (2)

user6016447
user6016447

Reputation: 21

my case in java, have a same situation, but i work around with modifying trigger start time as now background: my trigger doesn`t set trigger end time, only set trigger start time, after reschedule, i found out the problem will happen when you reset the time between trigger start time and current system time e.g trigger start time 2016/03/04 10:58 am and current system time 2016/03/04 11:05 am and you set cron expression 0 59 10 * * ?, the next fire time will be set at 2016/03/05 10:59 and fire the job immediately. After i reset start time before perform "reschedule", problem temporary solved

scheduler.pauseAll();
Date currentDate=new Date();
trigger.setStartTime(currentDate);
scheduler.rescheduleJob(trigger.getName(), trigger.getGroup(), trigger);
scheduler.resumeAll();

Upvotes: 2

AnonyMouse
AnonyMouse

Reputation: 442

Unscheduled the job, and then scheduled it.

this.scheduler.UnscheduleJob(key); 

var trigger = this.GetTrigger(key);
var triggerBuilder = trigger.GetTriggerBuilder();
ITrigger newTrigger = triggerBuilder.WithCronSchedule(cronexpression).Build();

this.scheduler.ScheduleJob(newTrigger);

Then went back to using RescheduleJob

var trigger = this.GetTrigger(key);
var triggerBuilder = trigger.GetTriggerBuilder();
ITrigger newTrigger = triggerBuilder.WithCronSchedule(cronexpression).Build();

this.scheduler.RescheduleJob(trigger.Key, newTrigger);

This solved my problem temporarily, but then the issue restarted again.

Upvotes: 0

Related Questions