7

MSMQでマルチキャストがどのように機能するかを理解しようとしていますが、同じマシンからでもメッセージをまったく受信できません。私は明らかに何か間違ったことをしていますが、何がわかりません。

これが私がいるところです:

と呼ばれる非トランザクションのプライベートキューを手動で作成してMulticastTestから、マルチキャストアドレスをに設定しました234.1.1.1:8001。次に、私のテスト送信アプリはこれを行います:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
queue.Send("Hello World");

これは機能しますが、少なくとも同じマシンの送信キューに表示されるメッセージを送信しているようです。少なくともこれは正しいと思いますが、そうでない場合は教えてください。

そのため、受信アプリを(同じマシン上で、または同じマルチキャストアドレスに構成された別のマシンで)実行しようとしましたが、動作させることができません。私がこれを試してみると:

MessageQueue queue = new MessageQueue("FormatName:MULTICAST=234.1.1.1:8001");
var message = queue.Receive();

それは単に機能しません、Receive()メソッドは次のように例外をスローします:

指定されたフォーマット名は、要求された操作をサポートしていません。たとえば、ダイレクトキューフォーマット名は削除できません

少なくともメッセージを待機しているのに受信キューを設定しようとして.\private$\MulticastTestも何も起こらない場合、すべてのメッセージは送信キューに残ります。

だから私は何が間違っているのですか?MSMQが送信キューからメッセージを送信するには、何らかのサービスを実行する必要がありますか?

また、この質問に従ってANONYMOUS USERに完全なアクセス許可を与えようとしましたが、影響はありません。

4

2 に答える 2

8

多くの実験の結果、マルチキャストキューを機能させるために必要な正しい手順を最終的に理解しました。

何よりもまず、MSMQマルチキャスト機能がインストールされていることを確認してください。サーバーの1つにマルチキャストアドレスを使用してキューを作成できたにもかかわらず、サーバーマネージャーは実際にはコンポーネントがインストールされていないと言っていました。

代わりにローカルマシンでこれを試した後、イベントログに次のメッセージが表示されました。

メッセージキューは、ローカルコンピューターの複数のIPアドレスを検出しました。メッセージキューは、マルチキャストメッセージにPGMドライバーによって決定されたデフォルトのIPアドレスを使用します。別のIPアドレスを使用するには、\ HKLM \ Software \ Microsoft \ MSMQ \ Parameters\MulticastBindIPレジストリ値を次の有効なIPアドレスのいずれかに設定します。[ここにリストされているIPアドレス]

ローカルエリアネットワークに複数のIPアドレスがあることがわかったので、最初にメッセージの送信に必要な正しいIPアドレスを使用してこのレジストリキーを追加し、次にメッセージキューサービスを再起動しました。詳細については、https ://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f = 255&MSPPError=-2147217396を参照してください。

次に、ANONYMOUS LOGONユーザーのメッセージキューにアクセス許可を追加する必要があったため、(少なくとも)受信と送信のアクセス許可を付与しました。

今何かを送信します。必要なキュー名の正しい形式は次のとおりです。

FormatName:MULTICAST=234.1.1.1:8001

または、マルチキャストIPアドレス/ポートが何であれ。送信アプリがメッセージを送信し、このマルチキャストアドレスに関連付けられているプラ​​イベートキューにメッセージが表示されることがわかりました。これは、メッセージが確実に送信されたことを意味します。

受信側では、プライベートキュー(上記のマルチキャスト形式ではない)をリッスンする必要があるため、次のことをリッスンします。

.\private$\MulticastTest

最後に、送信したメッセージが受信側に表示されます。

健全性チェックとして、同じマルチキャストアドレスを指す別のキューを設定し(そのマシンで上記と同じ手順を実行したことを確認します)、1つのマシンからメッセージを送信し、複数のマシンで受信できるようになりました。

この答えが私にとって本当に試行錯誤の努力だったので、他の人の助けになることを願っています。

于 2012-05-04T15:08:25.890 に答える
0

私は他の方法で同じ問題を解決しました:

  1. マルチキャストアドレスを使用してプライベートキューを作成します。
  2. 次までにプロデューサーにキューを作成する

    const string QUEUE_PATH = @ "formatname:MULTICAST = 234.1.1.1:8001"

    MessageQueue mq = new MessageQueue(QUEUE_PATH)

  3. 次にコンシューマーキューを作成します(各コンシューマーの名前は異なります!):

消費者1:

const string QUEUE_PATH =@"。\Private$ \ MSMQ-Task3-Consumer-1";

MessageQueue mq =!MessageQueue.Exists(QUEUE_PATH)?MessageQueue.Create(QUEUE_PATH):new MessageQueue(QUEUE_PATH);

mq.MulticastAddress = "234.1.1.1:8001";

消費者2:

const string QUEUE_PATH =@"。\Private$ \ MSMQ-Task3-Consumer-2";

MessageQueue mq =!MessageQueue.Exists(QUEUE_PATH)?MessageQueue.Create(QUEUE_PATH):new MessageQueue(QUEUE_PATH);

mq.MulticastAddress = "234.1.1.1:8001";

ソースはここで見つけることができます:https ://github.com/constructor-igor/TechSugar/tree/master/MessageQueue

設定の簡単な説明は次の場所にあります:https ://github.com/constructor-igor/TechSugar/wiki/MessageQueue

于 2015-02-03T09:53:44.350 に答える