2011-02-04 7 views
0

メッセージを読むためにC#でMSMQを使用します。私はこれをWindowサービスに入れていますので、OnStartではqueue.Bestを使ってメッセージを読むことを開始します。そして、OnEndメソッドqueue.Close();でキューを停止したい。 queue.Dispose()。サービスを使用したMSMQ C#実装(ServiceBase)

このアプローチの欠点はありますか?

おかげ オーシャン

答えて

1

これはかなり一般的なパターンですが、いくつかの欠点があります。

まず、スレッドプール(または4.0の.NETパラレルライブラリ)を使用して、メッセージを非同期に処理することを検討する必要があります。キューリーダーが非同期であるかどうかは、トランザクションパターンによって大きく異なります。処理はアトミックですか?

第2に、OnStartで開始してOnEndで終了し、各タイマーイベントでキューから1つ以上のメッセージを読み取るタイマー(System.Timers.Timer)の使用を検討する必要があります。

第3に、WCF MSMQバインディングを真剣に検討する必要があります。これは、このような複雑さの多くを処理します。

参照:http://jamescbender.com/bendersblog/archive/2009/04/04/the-one-where-i-talk-about-the-msmq-binding.aspx

+0

WCF配管の使用に同意すると、次のようになります。むしろ些細な仕事です。 –

1

あなたのアプローチは、私には正常に見えます。私の唯一のアドバイスは、Windowsサービスを展開しようとしているすべてのマシンが同じドメインにあるか、相互信頼のあるドメインがであり、同じフォレストに存在することを確認することです。私は最近、MSMQを活用している私が継承した解決策に問題がありました。これは、あなたが上で提案したのと同じように働きました。パフォーマンスの問題がなく、単一ドメインでの作業としてテストされました。残念ながら、クライアントは合併の過程にあり、ソリューションを広範な企業に実装する時期が来たときには、異なるフォレストの異なるドメインに存在するマシン上でソリューションを実装する必要があることが判明しました。その場合、MSMQまったく動かず、別のアプローチが完全に使われなければなりませんでした。

+0

あなたのキューはプライベートではなく公開されていると仮定します。プライベートキューはドメイン/ Active Directoryを気にせず、キューにアクセスするためのアクセス許可を確認します。 – RMD

+0

"これらのキューにアクセスするためのアクセス許可を確認することを除いて" - それはそのステートメントの重要な部分です。 – Rachel

+0

フォレスト間のMSMQメッセージの認証 http://blogs.msdn.com/b/johnbreakwell/archive/2008/10/13/authenticating-msmq-messages-between-forests.aspx クロスフォレストMSMQ?あなたは信頼する必要があります http://blogs.msdn.com/b/johnbreakwell/archive/2008/06/27/cross-forest-msmq-you-need-to-be-trusting.aspx 「どうしますか?ドメイン間でMSMQメッセージを送信しますか? http://blogs.msdn.com/b/johnbreakwell/archive/2008/02/14/how-do-i-send-msmq-messages-between-domains.aspx –

2

これは誤ったアプローチです。サービス開始時にOnStartを一度呼び出すと、初期化ロジックを置く必要があります。たとえば、ループ内でReceiveを呼び出すスレッドを開始します。

関連する問題