これを自動的に行うために使用できるさまざまなスケジューラーがあります。たとえば、Quartz.NETとそのAdoJobStore
. 私はそれを自分で使用したことはありませんが、適切に聞こえます:
含まれている AdoJobStore を使用すると、「不揮発性」として構成されたすべてのジョブとトリガーが、ADO.NET を介してリレーショナル データベースに格納されます。
または、データベースにタイマーが組み込まれている場合もあります。ただし、これが主に学術的な演習である場合 (「課題」で示唆されているように)、これらを使用できない場合があります。
スケジュールされたタスクのテーブルを保持し、列で次を指定します。
- タスクを次に実行する時期
- タスクは何をすべきか
- その後、そのタスクの次の反復を解決する方法
- タスクが開始された場合、開始された時間
- タスクが完了した場合、完了したとき
次に、無限ループでコードを記述して、そのテーブルをスキャンするだけです (たとえば、1 分に 1 回)。「次回」が今より前で、まだ完了していないすべてのタスクを探す必要があります。
- タスクが開始されていない場合は、行を更新して開始済み (現在) であることを示し、タスクの実行を開始します。
- タスクが最近開始された場合は、無視します
- タスクが「かなり前」に開始された (つまり、正常に実行するのにかかる時間よりも長い) 場合は、何らかの方法で「壊れた」とマークするか、再起動します。
タスクが正常に完了したら、行を更新して完了したことを示し、次に開始する必要があるときのために別の行を追加します。
エラー戦略が何であるかを正確に理解する必要があります。
- タスクが開始されてから失敗したと判断するまでのギャップはどれくらいですか?
- 常にタスクを再開したいですか、それとも一部の障害を永続化する必要がありますか?
- タスクが失敗した頻度を記録し、一定回数試行した後にあきらめる必要がありますか?
- 実行中にタスクが失敗したことにはっきりと気づいたら、どうしますか? (それがずっと前に始まったという事実だけではなく。)
信頼性を高めるには、他の側面も考慮する必要があります。
- 複数のタスクランナーが必要ですか?
- タスクランナーが失敗したことをどのように見つけて、それを再開できるでしょうか?
- 同じタスクを同時に開始しようとする複数のタスク ランナーにどのように対処しますか?
ここで実際にすべてを実装する必要はないかもしれませんが、検討する価値はあります。