Quartzで私が見つけた解決策は、トリガーの1つの時間間隔に戻って、次の発火時刻を計算することです。すべてのトリガーを反復処理することにより、トリガーが過去に発生したはずの最新の時刻を判別できます。
各発砲の間隔を計算します。
Date nextFireTime = trigger.getNextFireTime();
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime);
long interval = subsequentFireTime.getTime() - nextFireTime.getTime();
過去の間隔までの1回の次の発火時間を見つけます。
Date previousPeriodTime = new Date(System.currentTimeMillis() - interval);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
これを使用している場合CronTrigger
、過去に火の時間を求めることができなくなることがわかりました。これを回避するために、開始時刻を変更して、上記のスニペットは次のようになります。
Date originalStartTime = trigger.getStartTime(); // save the start time
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval);
trigger.setStartTime(previousPeriodTime);
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime);
trigger.setStartTime(originalStartTime); // reset the start time to be nice
すべてのトリガーを繰り返し処理し、過去に最も最近のものを見つけます。
for (String groupName : scheduler.getTriggerGroupNames()) {
for (String triggerName : scheduler.getTriggerNames(groupName)) {
Trigger trigger = scheduler.getTrigger(triggerName, groupName);
// code as detailed above...
interval = ...
previousFireTime = ...
}
}
これをヘルパーメソッドまたはクラスにリファクタリングするための演習として、読者に任せます。私は実際に上記のアルゴリズムをサブクラス化された委任トリガーで使用し、それを以前の起動時間でソートされたセットに配置します。