3

MSMQ からデータを読み取る MVC アプリケーションがあります。ユーザーがキューで正常な操作を行った場合にのみ、キューからメッセージを読み取り、キューから削除する方法を見つけようとしています。メッセージは、ユーザーが処理を完了するまでキューに残る必要があります。メッセージ オブジェクトを処理しているユーザーが操作を完了するまで、他のユーザーがメッセージを利用できないようにする必要があります。

Message オブジェクトが Peeked として設定され、このメッセージがキューに戻されるか、キューから削除されるまで、このメッセージを再度読み取ることができないプロパティはありますか?

この場合、MSMQ を使用することが適切かどうかわかりません。

4

2 に答える 2

2

トランザクション モードでキューを使用する必要があるようです。次に、クライアントはメッセージを受信して​​処理し、トランザクションコミットできます。この時点で、メッセージは最終的にキューから取り出されます。ただし、トランザクションがアクティブな間は、他のクライアントはメッセージを見ることができません。メッセージは、トランザクションが完了するか中止されるまで保留されます。

この MSDN の記事には、MSMQ を使用した信頼性の高いメッセージングの使用パターンの適切な概要が記載されています。

http://msdn.microsoft.com/en-us/library/ms978430.aspx

于 2009-09-02T22:35:12.230 に答える
0

キューは正しい考えです。「キューに入れておき、ロックしても、まだ利用できる」というアプローチは間違っています。

複数のキューが必要になる場合があります。

  1. プロセス A がキュー 1 に何かをエンキューする

  2. プロセス B はキュー 1 からデキューし、作業を開始します。

    • Bが成功したら、それで終わりです。

    • それ以外の場合は、フォローアップ作業のために別の場所 (おそらく同じキュー、またはおそらくキュー 2) にキューイングされます。

それがキュー 1 に戻った場合、B は最終的にそれを再び見つけます。別のキューに移動した場合、別のプロセスがクリーンアップ、ロギング、エラー修正などを行い、キュー 1 に何かを戻す可能性があります。

キューはデータベースではありません。ステートフルなものはありません (「私を見ないでください。私は処理されています」)。

キューは一時的なストレージです。誰かが書いて、誰かが読んで、それだけです。


信頼性が必要な場合は、これをお読みください: http://msdn.microsoft.com/en-us/library/ms978430.aspx

そしてこれ: http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx

そしてこれ: http://www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

信頼性はキューの機能であり、アプリケーションではありません。「回復可能な読み取り」を実行できます。これはキュー API の一部であるトランザクションです。

于 2009-09-02T21:07:07.307 に答える