MSMQ - 无法从多播队列接收

时间:2012-05-03 16:40:15

标签: c# msmq multicast

我试图了解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运行某种服务以从传出队列发送消息?

我也尝试按照this question向ANONYMOUS USER提供完全权限,但这没有任何影响。

2 个答案:

答案 0 :(得分:8)

经过多次实验,我终于找到了使组播队列工作所需的正确步骤。

首先,确保您已安装MSMQ Multicast功能!尽管能够在我的一台服务器上创建一个带有多播地址的队列,但服务器管理器实际上告诉我该组件未安装。

在我的本地计算机上尝试此操作后,我在事件日志中找到了此消息:

  

消息队列找到了本地计算机的多个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 :(得分:0)

我通过其他方式解决了同样的问题:

  1. 使用多播地址创建专用队列。
  2. 下一个

    在制作人中创建队列
      

    const string QUEUE_PATH = @“formatname:MULTICAST = 234.1.1.1:8001”

         

    MessageQueue mq = new MessageQueue(QUEUE_PATH)

  3. 接下来创建消费者队列(每个消费者有不同的名字!):

  4. consumer1:

      

    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”;

    consumer2:

      

    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