応答に応じてタスクをスケジュールしようとしています。タスクは次のようなものです。
public Date scheduledTask() {
Date nextRun;
// ...
nextRun = something();
// ...
return nextRun;
}
に到達したときに同じタスクが再度呼び出されるようにするにはどうすればよいnextRun
ですか?
ありがとうございました。
応答に応じてタスクをスケジュールしようとしています。タスクは次のようなものです。
public Date scheduledTask() {
Date nextRun;
// ...
nextRun = something();
// ...
return nextRun;
}
に到達したときに同じタスクが再度呼び出されるようにするにはどうすればよいnextRun
ですか?
ありがとうございました。
これは、標準の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);
}
}
テスト済みで、チャームのように機能します。
ここに記載されているアイデアに従ってください。そうすれば、次のことができるはずです。
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
。