我试图了解多播在 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 多播功能!尽管能够在我的一台服务器上创建具有多播地址的队列,但服务器管理器实际上告诉我该组件尚未安装。
在我的本地计算机上尝试此操作后,我在事件日志中发现了此消息:
消息队列发现本地计算机有多个 IP 地址。
消息队列将使用 PGM 确定的默认 IP 地址
多播消息的驱动程序。要使用不同的 IP 地址,请设置
\HKLM\Software\Microsoft\MSMQ\Parameters\MulticastBindIP 注册表
值为以下有效 IP 地址之一:[此处列出的 IP 地址]
事实证明,我的局域网有多个 IP 地址,因此首先我使用发送消息所需的正确 IP 地址添加了此注册表项,然后重新启动消息队列服务。更多详情可在这找到:
接下来,我必须为匿名登录用户向消息队列添加权限,因此我(至少)授予了接收和发送权限。
现在要送东西了。您需要的队列名称的正确格式如下:
FormatName:MULTICAST=234.1.1.1:8001
或者无论您的多播 IP 地址/端口是什么。我的发送应用程序现在发送了消息,我可以看到它现在出现在与该多播地址绑定的私人队列中。这意味着消息肯定已经发送了。
在接收端,我需要监听私有队列(不是上面的多播格式),所以我监听:
.\private$\MulticastTest
最后我看到我发送的消息出现在接收端。
作为健全性检查,我设置了另一个指向同一多播地址的队列(确保在该机器上遵循上述相同步骤),现在可以从一台机器发送消息并让多台机器接收该消息。
我希望这个答案对其他人有帮助,因为这对我来说是一次真正的反复试验。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)