package org.ovirt.engine.core.utils.timer;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobListener;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
/**
* The FixedDelayJobListener is a JobListener implementation to turn a job into
* a fixed delay job. A fixed delay job means that the delay is fixed between
* any 2 successive executions of the job.
*
*/
public class FixedDelayJobListener implements JobListener {
// const
public static final String FIXED_JOB_LISTENER_NAME = "fixedJobListenerName";
public SchedulerUtil sched;
/**
* create a new Job Listener.
*
* @param scheduler
* - the scheduler used rescheduling the next job
*/
public FixedDelayJobListener(SchedulerUtil scheduler) {
sched = scheduler;
}
/**
* @return the jobListener constant name
*/
@Override
public String getName() {
return FIXED_JOB_LISTENER_NAME;
}
/**
* reschedule the job with a new trigger. The new trigger will fire within a
* fixed time from the method execution.
*
* @see org.quartz.JobListener#jobWasExecuted(JobExecutionContext,
* JobExecutionException)
*/
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
// generate the new trigger time
JobDetail jobdetail = context.getJobDetail();
JobDataMap data = jobdetail.getJobDataMap();
long delay = data.getLongValue(SchedulerUtilQuartzImpl.FIXED_DELAY_VALUE);
TimeUnit delayUnit = (TimeUnit) data.getWrappedMap().get(SchedulerUtilQuartzImpl.FIXED_DELAY_TIME_UNIT);
Date runTime = SchedulerUtilQuartzImpl.getFutureDate(delay, delayUnit);
// generate the new trigger
Trigger oldTrigger = context.getTrigger();
String oldTriggerName = oldTrigger.getName();
String oldTriggerGroup = oldTrigger.getGroup();
SimpleTrigger newTrigger = new SimpleTrigger(oldTriggerName, oldTriggerGroup, runTime);
newTrigger.setJobGroup(jobdetail.getGroup());
newTrigger.setJobName(jobdetail.getName());
// schedule the new trigger
sched.rescheduleAJob(oldTriggerName, oldTriggerGroup, newTrigger);
// SchedulerUtilQuartzImpl.getInstance().rescheduleAJob(oldTriggerName,
// oldTriggerGroup, newTrigger);
}
@Override
public void jobExecutionVetoed(JobExecutionContext arg0) {
// empty implementation
}
@Override
public void jobToBeExecuted(JobExecutionContext arg0) {
// empty implementation
}
}