質問
別個の Web/デスクトップ アプリケーションの有無にかかわらず、Web アプリケーションのスケジュールされたタスクを作成するためのさまざまなアプローチには何がありますか?
解決
Microsoft プラットフォームについて話している場合、私は常にそのようなバッチ タスクを処理する別の Windows サービスを開発します。
厄介なコードの重複を避けるために、Web アプリケーションで使用されているものと同じアセンブリを常に参照できます。
他のヒント
Jeff は Stack Overflow ブログでこれについて議論しました -http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
基本的に、Jeff は、特定のタスクを呼び出すためのタイマーとして CacheItemRemovedCallback を使用することを提案しました。
私は個人的に、自動化されたタスクはサービス、Windows のスケジュールされたタスク、または SQL Server のジョブとして処理されるべきだと考えています。
Linux では、cron をチェックアウトします。
Stack Overflow 自体が ApplicationCache の有効期限を使用してバックグラウンド コードを一定間隔で実行していると思います。
Linux ホストを使用している場合は、ほぼ確実に次のものを使用することになります。 クロン.
Linux では cron ジョブを使用できます (http://www.unixgeeks.org/security/newbie/unix/cron-1.html) タスクをスケジュールします。
wget やcurl などの URL フェッチャーを使用して、HTTP GET リクエストを作成します。
ユーザー/パスワードを知らなければ誰もタスクを実行できないように、認証を使用して URL を保護します。
この作業には Windows の組み込みタスク スケジューラが推奨されるツールだと思います。それには外部アプリケーションが必要です。
これがあなたが探しているものかもしれないし、そうでないかもしれませんが、この記事を読んでください。ASP.NET を使用して Windows サービスをシミュレートし、スケジュールされたジョブを実行する」。StackOverflow がこのメソッドを使用する可能性があるか、少なくともそれを使用することが話題になったと思います。
私が働いている場所で使用した非常に簡単な方法は次のとおりです。
- タスクを実行する Web サービス/Web メソッドを設定します。この Web サービスは、必要に応じてユーザー名/パスを使用して保護できます。
- この Web サービスを呼び出すコンソール アプリを作成します。必要に応じて、コンソール アプリにパラメータを送信させたり、コンソールまたは外部ログへの出力用に何らかのメトリクスを取得したりすることができます。
- 選択したタスク スケジューラでこの実行可能ファイルをスケジュールします。
きれいではありませんが、シンプルで信頼性があります。コンソール アプリは基本的に、アプリに作業を開始するように指示するハートビートにすぎないため、アプリケーションとライブラリを共有する必要はありません。この方法論のもう 1 つの利点は、必要に応じて手動で開始するのが非常に簡単であることです。
wget やcurl などの URL フェッチャーを使用して、HTTP GET リクエストを作成します。
ユーザー/パスワードを知らなければ誰もタスクを実行できないように、認証を使用して URL を保護します。
たとえば、php スクリプトを直接実行するように cron に指示することもできます。また、PHP ファイルにアクセス許可を設定して、他の人がファイルにアクセスできないようにすることもできます。さらに良いのは、これらのユーティリティ スクリプトを Web アクセス可能なディレクトリに置かないことです。
Java と Spring -- クォーツを使用します。とても優しくて信頼できる -- http://static.springframework.org/spring/docs/1.2.x/reference/scheduling.html
cron (Linux) やタスク スケジューラ (Windows) を使用するよりも簡単な方法があると思います。以下を使用して、これを Web アプリに組み込むことができます。(a) クォーツスケジューラ、
または、別のサードパーティ ライブラリをアプリケーションに統合したくない場合は、次のようにします。(b) 起動時に、標準 Java 'java.util.Timer' クラスを使用してタスクを実行するスレッドを作成します。