0

私は毎時1分を実行する仕事をしています。

ジョブは現在の時間を取得し、DBにクエリを実行して、この時間に送信される通知があるかどうかを確認します。通知がある場合は、電子メール通知を送信します。

今、問題は失火の処理にあります。

たとえば、スケジューラが午前8時30分から午前10時30分までの間にダウンした場合、2つのトリガーを逃しました。スケジューラーが10:30に起動したときに、これらの2つの欠落したトリガーを起動する必要があるため、MisfireHandlingInstructionIgnoreMisfiresトリガーを使用してクォーツを使用しています。

私の仕事には1日の現在の時間に基づいてクエリを実行するロジックがあるため、両方の失火トリガーは通知をクエリして午前10時のみ(午前8時と午前9時ではない)に送信します。

このシナリオをどのように処理しますか?

クォーツはとにかく仕事の中の失火数をチェックする必要がありますか?

あなたの助けに感謝 !!

4

1 に答える 1

3

あなたの場合、現在のシステム日付に依存する代わりに、スケジュールされた日付を取得する必要があります:

void execute(JobExecutionContext context) {
    context.getScheduledFireTime()
    //...
}

通常、現在のシステム時間は、スケジュールされた起動時間に非常に近いはずです。しかし、失火の状況や高負荷下では、スケジュールされた発火時刻は現在の時刻よりもかなり前になります (遅延が発生します)。

正確には、あなたのケースでは 10:30 にジョブが 2 回トリガーされ、getScheduledFireTime()9:00 と 10:00 が返されます。

于 2012-07-11T21:14:43.860 に答える