MSMQ - 无法从多播队列接收

本文关键字:队列 多播 MSMQ | 更新日期: 2023-09-27 18:32:59

我试图了解多播在 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 是否需要运行某种服务才能从传出队列发送消息?

我也尝试根据此问题向匿名用户授予完全权限,但这没有任何影响。

MSMQ - 无法从多播队列接收

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

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

在本地计算机上尝试此操作后,我在事件日志中发现了以下消息:

消息队列找到本地计算机的多个 IP 地址。 消息队列将使用 PGM 确定的默认 IP 地址 多播消息的驱动程序。要使用其他 IP 地址,请将 ''HKLM''软件''Microsoft''MSMQ''参数''多播绑定IP 注册表 值为以下有效 IP 地址之一:[此处列出的 IP 地址]

事实证明,我的局域网有多个 IP 地址,因此首先我使用发送邮件所需的正确 IP 地址添加了此注册表项,然后重新启动邮件队列服务。更多细节可以在这里找到:https://technet.microsoft.com/en-us/library/cc770813%28v=ws.10%29.aspx?f=255&MSPPError=-2147217396

接下来,我

必须为匿名登录用户向邮件队列添加权限,因此我(至少(授予了"接收"和"发送"权限。

现在发送一些东西。您需要的队列名称的正确格式如下:

FormatName:MULTICAST=234.1.1.1:8001

或任何您的组播 IP 地址/端口。我的发送应用程序现在发送了消息,我可以看到它现在出现在我的专用队列中,该队列与此多播地址相关联。这意味着消息肯定已发送。

在接收端,我需要侦听专用队列(不是上面的组播格式(,所以我侦听:

.'private$'MulticastTest

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

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

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

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

  1. 使用多播地址创建专用队列。
  2. 在生产者中创建队列

    常量字符串 QUEUE_PATH = @"格式名称:MULTICAST=234.1.1.1:8001">

    MessageQueue

    mq = new MessageQueue(QUEUE_PATH(

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

消费者1:

const string QUEUE_PATH = @".''Private$''MSMQ-Task3-Consumer-1";

消息队列 mq = !MessageQueue.Exists(QUEUE_PATH( ?MessageQueue.Create(QUEUE_PATH( : new MessageQueue(QUEUE_PATH(;

MQ.组播地址 ="234.1.1.1:8001";

消费者2:

const string QUEUE_PATH = @".''Private$''MSMQ-Task3-Consumer-2";

消息队列 mq = !MessageQueue.Exists(QUEUE_PATH( ?MessageQueue.Create(QUEUE_PATH( : new MessageQueue(QUEUE_PATH(;

MQ.组播地址 ="234.1.1.1:8001";

来源可以在这里找到: https://github.com/constructor-igor/TechSugar/tree/master/MessageQueue

可以找到简短的设置说明:https://github.com/constructor-igor/TechSugar/wiki/MessageQueue