Reputation: 442
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
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
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