我正在尝试根据任务的响应来安排任务。任务是这样的:
public Date scheduledTask() {
Date nextRun;
// ...
nextRun = something();
// ...
return nextRun;
}
如何确保在到达时再次调用相同的任务nextRun
?
谢谢你。
我正在尝试根据任务的响应来安排任务。任务是这样的:
public Date scheduledTask() {
Date nextRun;
// ...
nextRun = something();
// ...
return nextRun;
}
如何确保在到达时再次调用相同的任务nextRun
?
谢谢你。
按照这里提到的想法,那么你应该能够:
public class GuaranteeSchedule implements Trigger {
private Future<?> resultForNextRun;
private TaskScheduler scheduler;
public void scheduledTask() {
// 'this' is this trigger that is used by the scheduler
// and the method `nextExecutionTime` is automatically called by the scheduler
resultForNextRun = scheduler.schedule(theTask, this);
// theTask is the object that calls something()
}
// Implementing Trigger to add control dynamic execution time of this trigger
@Override
public Date nextExecutionTime(TriggerContext tc) {
// make sure the result for the previous call is ready using the waiting feature of Future
Object result = resultForNextRun.get();
// Use tc or other stuff to calculate new schedule
return new Date();
}
}
其余的,您应该遵循参考中提到的配置。我相信这将解决将触发器的下一个调用依赖于前一个结果的问题。您可能还需要小心第一次调用scheduledTask
以确保resultForNextRun != null
.
使用标准 Quartz 调度程序 API,这非常简单。在您的Job
计算nextRun
时间内并创建一个触发器,并startAt()
定义:
public class ScheduledJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
final Date nextRun = something();
Trigger trigger = newTrigger().
startAt(nextRun).
forJob(context.getJobDetail()).
build();
context.getScheduler().scheduleJob(trigger);
}
}
经过测试,就像一个魅力。