2009-08-23 30 views
26

ASP.NET MVC Webアプリケーションでバックグラウンド処理キューを実装するにはどうすればよいですか?ほとんどのデータ変更や更新などは即座に表示する必要がありますが、リアルタイム処理が不要なその他のアップデートがありますが、これは独自のペースで処理する優先度の低いバックグラウンドプロセスに移行したいものです。ASP.NET MVC Webアプリケーションのキューベースのバックグラウンド処理

例として、StackOverflowのバッジ受賞システムを取ってください。通常、バッジを授与する特別な行動をとることができますが、実際の「賞」は後で発生します(通常10分から数時間後)。私はこれが別のバックグラウンドプロセスを経て行われたと仮定しています。これは、得た時点でバッジをすぐに賞賛するSOの仕事にとって重要ではないからです。

私はタスクを詰めることができるいくつかの種類のキューシステムを作成しようとしています(最終的に別のプロセスによって実行されるProcess()メソッドを持つITaskインターフェイスを実装するもの)。

どうすればこのようなシステムを実装できますか?アイデア/ヒント/サンプルコード?

ありがとうございました!

答えて

20

WindowsサービスとMSMQはそれらと通信します(必要があれば)。

- 編集

少し拡大してください。

あなたは何をしたいかに応じていくつかのサービスを作成し、それらはすべてあなたが望むことをするためにさまざまなスリープレベルの無限のスレッドを実行させます。彼らはデータベースを適切に更新し、クライアント側で何もする必要はありません。

管理者の観点から対話したい場合は、管理者コマンドを聞くMSMQがあるかもしれません。あなたの実装に応じて、何らかの理由でそれらを再起動する必要があるかもしれません。あるいは、実行したいことが何であれ実行を強制するだけかもしれません。

したがって、MSMQプライベートキューを使用して(System.Messaging名前空間)使用します。 MSMQに関する重要な点の1つは、メッセージが< 4megである必要があることです。したがって、大きなオブジェクトグラフを送信する場合は、最初にファイルにシリアル化し、ファイル名を送信してください。

MSMQは非常に美しいです。あなたは、いくつかの面白い理由で、相関IDは、の形式でなければなりません、あなたがする必要がある場合は、「相関ID」に基づいて送ることができますが、:

{guid}\1 

他に何かがうまくいかない(少なくともバージョン2.0にコードが変更されている可能性があります)。

- 要求されたとして、

例を編集します。

using System.Messaging; 

... 


MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = new Message(); 
m.Body = "your serialisable object or just plain string"; 

queue.Send(m); 


// on the other side 

MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = queue.Receive(); 

string s = m.Body as string; 

// s contains that string now 
+1

からこの偉大な記事を読んで、あなたが最初にASP.NET MVCに、その後MSMQでサービスアプリケーションを「接続」とする方法の例を持っていますか?これは私にはかなり新しいものです。ありがとうございました! – Alex

+0

適切なキューに書き込むだけです。あなたのサービスは.Receiveを呼び出すでしょう。あなたのページはキューからメッセージを送りたいので、単に ".Send"を呼び出します。私は小さな例で更新します。 –

+0

が更新されました。注キューが存在しない場合は、そのキューを作成するコードは表示されていません。しかし、それはSystem.Messaging APIのように簡単に見つけることができます。特に:MessageQueue.Create(...)。また、適切な権限を取得する必要があります。 (.SetPermissions)。 –

10

ジェフはそれが同等の信頼性ではないかもしれませんが、彼はhttp://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

でスタックオーバーフローのため、もともとこれを達成する方法を示す偉大なポストを持っていますそれがオプションであればサービスとして、それは過去に非本質的な仕事のためによく役立ちました。そして、私は仮想ホスティング環境でそれを働かせました。

5

ASP.NET MVCのバックグラウンドプロセスを検索するときにこの質問が見つかりました。 (.NET 4.5の後に利用可能です。2)

public ActionResult InitiateLongRunningProcess(Emails emails) 
{ 
    if (ModelState.IsValid) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(ct => LongRunningProcessAsync(emails.Email)); 
     return RedirectToAction("Index", "Home"); 
    } 

    return View(user); 
} 

注:私は個人的にバックグラウンドタスクを実行するためにWebサーバーを使用しません。また、ホイールを再発明しないでください、Hangfireを使用することを強くお勧めします。

Hanselman氏HowToRunBackgroundTasksInASPNET

関連する問題