我会建议为你的DB两个偏移更大的灵活性和可配置性,以更好地存储:在repeatOffset它会告诉你多久后的工作应该重试和trialPeriodOffset将保持 作业为 的时间窗信息允许重新安排。然后
String repeatOffset = yourDBUtilsDao.getConfigParameter(..);
String trialPeriodOffset = yourDBUtilsDao.getConfigParameter(..);
,而不是工作,注意,反将需要记住initalAttempt:然后你可以检索这两个参数,如(我假设你正在使用Spring)
Long initialAttempt = null;
initialAttempt = (Long) existingJobDetail.getJobDataMap().get("firstAttempt");
,并执行在类似下面的检查:
long allowedThreshold = initialAttempt + Long.parseLong(trialPeriodOffset);
if (System.currentTimeMillis() > allowedThreshold) {
//We've tried enough, time to give up
log.warn("The job is not going to be rescheduled since it has reached its trial period threshold");
sched.deleteJob(jobName, jobGroup);
return YourResultEnumHere.HAS_REACHED_THE_RESCHEDULING_LIMIT;
}
这将是创建正在被返回到您的的核心工作流程的尝试的结果枚举一个好主意像上面的应用程序。
进而构建补赛时间:
Date startTime = null;
startTime = new Date(System.currentTimeMillis() + Long.parseLong(repeatOffset));
String triggerName = "Trigger_" + jobName;
String triggerGroup = "Trigger_" + jobGroup;
Trigger retrievedTrigger = sched.getTrigger(triggerName, triggerGroup);
if (!(retrievedTrigger instanceof SimpleTrigger)) {
log.error("While rescheduling the Quartz Job retrieved was not of SimpleTrigger type as expected");
return YourResultEnumHere.ERROR;
}
((SimpleTrigger) retrievedTrigger).setStartTime(startTime);
sched.rescheduleJob(triggerName, triggerGroup, retrievedTrigger);
return YourResultEnumHere.RESCHEDULED;
谢谢。这是我正在寻找。 – Averroes 2010-12-13 15:42:14
-1,我不推荐这种方法 - 它会阻塞一个Quartz工作线程10分钟。正确的做法是促进现有的Quartz功能 - 告诉它以某种方式在10分钟后重新运行相同的工作 - 毕竟,这是它的目的。如果我们要运行一些代码并进行睡眠,首先使用Quartz就没有意义了。 – 2012-03-05 15:14:17
在Quartz 2.0中补充说明(至少对于.net)。该StatefulJob由'PersistJobDataAfterExecutionAttribute' http://quartznet.sourceforge.net/apidoc/2.0/html/html/babe3560-218c-38de-031a-7fe1fdd569d2.htm – ossek 2014-03-24 19:08:45