1

cron のように、スケジュールする必要があるタスクのリストがあります。これは、SQL サーバーでのバックアップ用です。

データベースは、いくつかの組み合わせで FULL、DIFF、LOGS バックアップを実行します。

そう:

  • 毎日午前8時に満席
  • 毎時DIFF
  • 10分ごとに記録

ただし、次の問題があります。

  • サーバーが午前 8 時 15 分に起動した場合、FULL タスクは実行されません。
  • FULL が失敗した場合、DIFF & LOG を実行しても意味がありません
  • サーバーが土曜日の午前 8 時 15 分に起床した場合、LOG は 8 時 20 分に開始して起動し、次の月曜日まで待機する必要があります。
  • LOG に時間がかかりすぎる場合 (午前 9:01 に終了しない場合)、LOG がまだ完了していないときに DIFF を開始します。私はそれをしたくない !

私はこれを Quartz.net で行いますが、それは接線です-私は lib を変更したり、削除したりします.-. したがって、私の主な目的は、タスクのシーケンス/実行における信頼性です。

シーケンシャル コードでは、これは非常に簡単に実行できます。

  • DO_FULL THEN
  • DO_DIFF THEN
  • DO_LOG

ただし、スケジューラを使用すると、これは不可能になります (少なくともクォーツでは)。

問題は時間の管理です。タスクが 1 時間ごとに開始されるようにマークされている場合、前のタスクが完了していない可能性があるため、厳密なルールというよりもヒントに違いありません。また、サイクルを開始するには、FULL を実行する必要があります。

ここでアルゴリズムを適用する必要があるのだろうか。

4

2 に答える 2

0

実行されるタスクを追跡する必要があります。たとえば、DIFF を実行するには、最初に FULL を実行する必要があります。これを実現するには、タスクを開始し、FULL のステータスを false に設定します。FULL が作業を完了したら、ステータスを true に設定します。DIFF を実行する時間になると、(FULL が生成する true または false の値に基づいて) FULL の準備ができているかどうかがチェックされます。そうでない場合、DIFF は、FULL が作業を完了したというシグナル (true) を送信するまで待機します。LOG を実行する場合も同様です。これは、順次動作を実現する簡単な方法です。

于 2012-08-11T00:35:05.580 に答える
0

最も簡単な解決策は、(設計上、継続的に実行される) Windows サービスを作成することです。

  1. Windows サービスは、そのスレッドの 1 つ (T0) 8:00 をウェイクアップします。
  2. T0 は必要な検証を実行し、失敗した場合は警告を発して中止し、失敗した場合は完全なバックアップ スレッド T1 を生成します。
  3. T1 は、すべての検証が良好な場合にのみ実行されるため、バックアップを続行してください。
  4. T1 が正常に完了すると、サービスはその差分スレッド (T2) とログ スレッド (T3) を起動します。
  5. T2 と T3 は、T1 が最後に正常に実行されたかどうかをチェックします。T1 が失敗した場合、T2 と T3 も中止されます。
  6. T2 は 1 時間ごとに実行され、差分を実行してスリープします。
  7. T3 は 15 分ごとに実行されます。T2 が実行されているかどうかを確認する必要があります。実行されている場合は、再度スリープして (x 秒間)、再試行します。T2 が T3 を実行していない場合は、その職務を実行する必要があります。
  8. 必要に応じて、一日の終わりの所定の時間に、すべてのスレッドをリセットまたは中止する必要があります。
于 2012-08-11T00:12:53.143 に答える