0

応答に応じてタスクをスケジュールしようとしています。タスクは次のようなものです。

public Date scheduledTask() {
    Date nextRun;
    // ...
    nextRun = something();
    // ...
    return nextRun;
}

に到達したときに同じタスクが再度呼び出されるようにするにはどうすればよいnextRunですか?

ありがとうございました。

4

2 に答える 2

0

これは、標準の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);
    }

}

テスト済みで、チャームのように機能します。

于 2012-04-16T19:55:11.557 に答える
0

ここに記載されているアイデアに従ってください。そうすれば、次のことができるはずです。

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

于 2012-04-16T19:19:53.807 に答える