前の会社で同じ問題を抱えていました。最後に、タスク スケジューラに行きました。主な理由は、タスク スケジューラが Windows で反復的なタスクを処理するための標準的なメカニズムであるため、他のオプションよりも将来的に保守しやすいためです。
タスク スケジューラによって毎日実行されるコンソール アプリは、「スマート」になるように設計されています。スマートとはつまり。
- コンソール アプリは、WCF サービスを呼び出すダミー アプリケーションでした。すべてのロジックは WCF サービス内にありました。その理由は、すべてのコードを同じ場所に保持するためでした。
- 実行に失敗すると、システム ログにアラームが書き込まれます (毎日チェックされ、DB テーブルでした)。壊滅的な障害 (DB へのアクセスなし) の場合、コンソール アプリ ディレクトリのファイルに書き込みました。
- すでに処理中の場合、2 番目のインスタンスの実行は許可されませんでした (ある種のシングルトン)。
- どのメールが送信されたかをDBで追跡するため、同じ日に2回実行した場合、最初のメールのみが送信されます。
- /whatifパラメータがありました
- 電子メールが失敗した場合、ログに記録され、プロセスが続行されました。
- 複数の電子メールを送信する必要があり、ある時点で失敗した場合、次の実行は停止した時点から再開されます。
内部的には、コードは次のようなものでした
Linq to get all the users that deserved an email
For each user
Send the email, mark it as sent in DB and close transaction
If email fails Write to log.
Next
Write log with stats
この方法は遅くなりましたが、より安全でした。4000 人のユーザーにメールを送信する必要があり、ユーザー 1337 で失敗した場合、何が起こったかのログがあり、次に実行されると 1338 から再開されます。
あるフォルダーのシステムログには、通常、次のようなエントリが毎日ありました。
電子メール プロセスは、スケジューラによって 02:00 に開始されました。4000通のメールが送信され、0通が失敗しました。
何かが失敗した場合:
電子メール プロセスは、スケジューラによって 02:00 に開始されました。3999 通のメールが送信され、1 通が失敗しました。ユーザー xxxxx への電子メールに失敗しました。理由: メールアドレス「joeBlogs@@gmail.com」が正しくありません。