今日、ASP.NET Webサイトのスケジュールされたタスクを実行するためのコンソールアプリケーションを作成しました。しかし、このアプローチは少しエラーが発生しやすく、維持するのが難しいと思います。スケジュールされたタスクをどのように実行しますか(windows / IIS / ASP.NET環境)
更新:
タスクの例:
- データベースのメールキューからメールを送信する
- データベースから古いオブジェクトを削除する
- Google AdWordsから統計を取得し、データベースにテーブルを入力します。
今日、ASP.NET Webサイトのスケジュールされたタスクを実行するためのコンソールアプリケーションを作成しました。しかし、このアプローチは少しエラーが発生しやすく、維持するのが難しいと思います。スケジュールされたタスクをどのように実行しますか(windows / IIS / ASP.NET環境)
更新:
タスクの例:
回答:
Webサイトのすべてのタスク(スケジュールが必要)はWebサイト内に保持され、特別なページから呼び出されます。次に、このページを時々呼び出す単純なWindowsサービスを作成しました。ページが実行されると、値が返されます。実行する作業がまだあることがわかっている場合は、すぐにもう一度ページを実行します。それ以外の場合は、しばらく実行します。これは私にとって非常にうまく機能しており、すべてのタスクロジックをWebコードで保持します。単純なWindowsサービスを作成する前に、Windowsスケジューラーを使用して、x分ごとにページを呼び出しました。
これを実行するもう1つの便利な方法は、Pingdomなどの監視サービスを使用することです。サービスコードを実行するページにhttpチェックをポイントします。ページが結果を返すようにします。この結果を使用して、何かが正しくない場合にPingdomをトリガーしてアラートメッセージを送信できます。
StackoverflowのためのJeff Atwoodによるこの手法は、私が遭遇した最も簡単な方法です。ASP.NETのキャッシュシステムに組み込まれた「キャッシュアイテムが削除されました」コールバックメカニズムに依存しています
更新:Stackoverflowはこのメソッドを超えています。これはWebサイトの実行中にのみ機能しますが、多くの人にとって役立つ非常にシンプルな手法です。
Quartz.NETもチェックしてください
No, we’ve switched to a dedicated task. We definitely outgrew this technique. I do think it’s fine for small sites though!
カスタムWindowsサービスを作成します。
私はいくつかのミッションクリティカルなタスクをスケジュールされたコンソールアプリとしてセットアップしていて、それらを維持するのが難しいと感じました。私は、DBのスケジュールを数分ごとにチェックする「ハートビート」を備えたWindowsサービスを作成しました。本当にうまくいきました。
そうは言っても、重要ではないメンテナンスタスクのほとんどには、引き続きスケジュールされたコンソールアプリを使用しています。壊れていない場合は修正しないでください。
これは関係者全員にとって簡単であることがわかりました。
この方法論を使用すると、すべてのビジネスロジックがWebアプリに含まれますが、Windowsタスクマネージャーやその他の商用タスクマネージャーの信頼性があり、開始して実行レポートなどの戻り情報を記録できます。ページに投稿する代わりにWebサービスを使用すると、Webサービスから戻りデータを取得しやすくなるため、少し有利です。
ホイールを再発明する理由は、ThreadingクラスとTimerクラスを使用することです。
protected void Application_Start()
{
Thread thread = new Thread(new ThreadStart(ThreadFunc));
thread.IsBackground = true;
thread.Name = "ThreadFunc";
thread.Start();
}
protected void ThreadFunc()
{
System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(TimerWorker);
t.Interval = 10000;
t.Enabled = true;
t.AutoReset = true;
t.Start();
}
protected void TimerWorker(object sender, System.Timers.ElapsedEventArgs e)
{
//work args
}
Windowsスケジューラを使用してWebページを実行します。
悪意のあるユーザーまたは検索エンジンのスパイダーによる実行を防ぐには、スケジュールされたタスクを設定するときに、クエリ文字列を使用してWebページを呼び出します。つまり、mypage.aspx?from = scheduledtask
次に、ページの読み込みで、条件を使用します:if(Request.Querystring ["from"] == "scheduledtask"){// executetask}
このようにして、検索エンジンのスパイダーや悪意のあるユーザーは、スケジュールされたタスクを実行できなくなります。
Request.IsLocal>>サーバー自体だけがスケジュールされたタスクを実行でき、他のユーザーは実行できません。
このライブラリはチャームhttp://www.codeproject.com/KB/cs/tsnewlib.aspxのように機能し ます
.NETコードを使用して、Windowsのスケジュールされたタスクを直接管理できます。
予定されているタスクの種類がわかりません。「毎時間、foo.xmlを更新する」タイプのタスクなどを意味する場合は、Windowsスケジュールタスクシステムを使用してください。(「at」コマンド、またはコントローラー経由。)コンソールアプリを実行するか、プロセスを開始する特別なページを要求します。
編集:追加する必要があります。これは、スケジュールされたポイントでIISアプリを実行するためのOK方法でもあります。したがって、DBを30分ごとにチェックし、一部のデータについてユーザーにリマインダーを電子メールで送信する場合、スケジュールされたタスクを使用してこのページを要求し、IISで処理を行うことができます。
ニーズがより複雑な場合は、Windowsサービスを作成し、ループを実行して必要な処理を実行することを検討してください。これには、スケーリングまたは管理の目的でコードを分離するという利点もあります。欠点としては、Windowsサービスに対処する必要があります。
ASP.NETプロジェクトでAbidarを正常に使用しました(ここにいくつかの背景情報があります)。
このメソッドの唯一の問題は、ASP.NET Webアプリケーションがメモリからアンロードされると(つまり、使用率が低いため)、タスクが実行されないことです。私が試したことの1つは、Webアプリケーションを5分ごとにヒットしてそれを維持するタスクを作成することですが、これは確実に機能するようには見えなかったため、代わりにWindowsスケジューラと基本的なコンソールアプリケーションを使用しています。
理想的な解決策は、Windowsサービスを作成することですが、これは不可能かもしれません(つまり、共有ホスティング環境を使用している場合)。また、メンテナンスの観点からは、Webアプリケーション内に物事を維持することが少し簡単になります。
ここに別の方法があります:
1)タスクの起動が期限切れまたは期限切れの場合にタスクを起動する「ハートビート」Webスクリプトを作成します。
2)Webscriptにアクセスして定期的に実行するように強制するスケジュールされたプロセスをどこかに(できれば同じWebサーバー上に)作成します。(WindowsはIEまたはwhathaveyouを使用してHeatbeatスクリプトを静かに起動するタスクをスケジュールします)
タスクコードがWebスクリプト内に含まれているという事実は、Webアプリケーションのコードベース内にコードを保持するためだけのものです(両方が相互に依存していることが前提です)。これは、Web開発者が管理しやすくなります。 。
代替のアプローチは、すべてのスケジュール作業自体を実行し、実行可能ファイル自体をスケジュールされたタスクとして実行する実行可能サーバースクリプト/プログラムを作成することです。これにより、Webアプリケーションとスケジュールされたタスク間の基本的な分離が可能になります。したがって、Webアプリケーション/データベースがダウンしているかアクセスできない場合でも、スケジュールされたタスクを実行する必要がある場合は、このアプローチを使用する必要があります。
'ThreadPool.RegisterWaitForSingleObject'メソッドを使用すると、一定の間隔でコードを実行するWindowsサービスを簡単に作成できます。それは本当に洗練されていて、セットアップするのは非常に簡単です。この方法は、フレームワークでタイマーを使用するよりも効率的な方法です。
詳細については、以下のリンクをご覧ください。
Windowsサービスを使用して.NETで定期的なプロセスを実行する:http :
//allen-conway-dotnet.blogspot.com/2009/12/running-periodic-process-in-net-using.html
コンソールアプリケーションも使用します。Log4netのようなロギングツールを使用すると、その実行を適切に監視できます。また、適切に設計されていれば、同じコードライブラリの一部を2つの間で共有している可能性があることを考えると、それらがWebページよりも維持が難しいかどうかはわかりません。
これらのタスクを時間ベースで実行させたくない場合は、Webページの管理セクションにキューとして機能するWebページを置くことができます。ユーザーがタスクを実行するリクエストを入力すると、MyProcessQueueテーブルに空の日付スタンプレコードが挿入され、スケジュールされたタスクがMyProcessQueueの新しいレコードをX分ごとにチェックしています。このようにして、顧客が実行したい場合にのみ実行されます。
これらの提案がお役に立てば幸いです。
.NET用の新しいタスクスケジューラクラスライブラリ
注:このライブラリが作成されてから、MicrosoftはWindows Vista用の新しいタスクスケジューラ(タスクスケジューラ2.0)を導入しました。このライブラリは、タスクスケジューラ1.0インターフェイスのラッパーであり、Vistaでも引き続き使用でき、Windows XP、Windows Server 2003、およびWindows 2000と互換性があります。