0

要件は単純で、サーバーが変数 salesOffRatio を 01-01 と 01-10 の間で合計 10 日間 0.8 に設定する必要があるとします。また、「salesOffRatio = 0.8」は、01-10 00:00:00 にクォーツ トリガーによってトリガーされたジョブです。問題は、電源不足のために 01-05 にサーバーが再起動され、変数 salesOffRatio が 0.8 ではなくなり、01-10 00:00:00 が経過したため、初期値になり、トリガーが発火しないことです。

この種の問題を解決する解決策はありますか?ジョブは非常に長い期間状態を設定する必要があり、操作を維持するためにその期間中にサーバーを再起動する必要があるため、自動再スケジュールが必要です。これは避けられません。

jdbcJobStore での失火は問題ないようです。適切な失火のしきい値を設定してください。しかし、それは普遍的です。この状況では、ジョブごとに個別の値を設定する必要があります (salesOffRatio1、salesOffRatio2...)

4

2 に答える 2

1

私が思いついたいくつかの解決策:

  1. salesOffRatioサーバーの再起動に耐える必要があります。データベース、ファイルなどに保存します。変数を変更する代わりに、ジョブでデータベースを更新します。

  2. ユースケースが非常に単純な場合は、関数を作成してみませんか

    double getSalesOffRatio(Date effectiveDate)
    

    渡さsalesOffRatioれたものに応じて正しい値を返しますか? effectiveDate言い換えれsalesOffRatioば、必要なときに計算するだけです。ところで、追加の引数により、内部の現在のシステム時刻を読み取るよりもテストが簡単になりますgetSalesOffRatio()

  3. XML スケジューリング プラグインまたはその他の方法を使用して、サーバーが再起動するたびにすべてのジョブを再スケジュールできます。デフォルトでは、ジョブはトリガーされた後に削除されます (durableプロパティ)。ミスファイア ポリシーを慎重に構成することで、スケジューラは起動時にすべてのジョブを再起動します。私の意見では脆い。

最終的な考え: ミスファイア ポリシーについて話していますが、ジョブがスケジュールされたときに再起動が発生した場合に何が起こるか考えましたか?

于 2012-08-13T20:44:07.390 に答える
0

'salesOffRatio' の値をデータベースまたはファイルに保持し、デフォルト値に初期化するのではなく、保存された値に初期化することができます。

または、起動時にプログラムを実行して、すべての Quartz トリガー (またはこれらの値を更新する必要があるジョブグループ内のトリガーのみ) を再実行することもできます。

于 2012-08-10T09:26:15.407 に答える