【问题标题】:MSMQ - Cannot receive from Multicast queuesMSMQ - 无法从多播队列接收
【发布时间】:2012-05-13 05:21:48
【问题描述】:

我试图弄清楚多播在 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 向匿名用户授予完全权限,但这没有任何影响。

【问题讨论】:

    标签: c# msmq multicast


    【解决方案1】:

    经过大量实验,我终于找到了让多播队列正常工作所需的正确步骤。

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

    在我的本地机器上尝试后,我在我的事件日志中发现了这条消息:

    消息队列发现本地计算机的多个 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
    

    最后我看到我发送的消息出现在接收端。

    作为健全性检查,我设置了另一个指向相同多播地址的队列(确保在该机器上我遵循了上述相同步骤),现在可以从一台机器发送消息并让多台机器接收。

    我希望这个答案对其他人有所帮助,因为这对我来说是一次真正的反复试验。

    【讨论】:

    • 嗨彼得,我按照这些步骤仍然无法在不同的机器上接收消息,它在同一台机器上工作正常,我在事件日志中看到该消息,它在消息中提示 2 IP,我使用该 IP 添加密钥。
    • technet 链接已失效。你能更新或删除它吗?
    • @SeanB 将链接替换为另一个希望传达正确信息的链接,这是很久以前的事了!
    【解决方案2】:

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

    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

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      相关资源
      最近更新 更多