在System.Messaging和MSMQ 3.0中使用多播队列

时间:2011-12-21 10:30:39

标签: .net vb.net msmq

我正在尝试使用MessageQueues使用多播功能通知用户数据更改的应用程序,但无法使其工作:发送消息的工作站确实收到它,但似乎没有其他正在运行的工作站抓住已发送的消息。

发送消息的步骤如下:

Dim sendQueue As New Messaging.MessageQueue("FormatName:MULTICAST=234.1.1.1:8001")
Dim message As New Messaging.Message("message body...")
sendQueue.Send(message)

接收他们:

Dim receiveQueue As New Messaging.MessageQueue(".\private$\myQ")
receiveQueue.MulticastAddress = "234.1.1.1:8001"
receiveQueue.BeginReceive()

AddHandler receiveQueue.ReceiveCompleted, Sub(sender As Object, e As Messaging.ReceiveCompletedEventArgs)
    ' ... handle message
    receiveQueue.BeginReceive()
End Sub

所以我显然遗漏了一些东西,而且我似乎找不到任何有关使用MSMQ 3.0在.NET中进行多播的好资源。

另外,目前尚不清楚的是我是应该为每个工作站使用本地队列,还是在服务器上使用一个远程队列来组播消息?在组播消息上使用receive方法是否从队列中清除它们?

任何帮助,提示,提示,建议,任何......都将受到欢迎。

另外,所有工作站都在同一个子网上,并且都安装了MSMQ 3.0。

最后一句话

非常感谢笔记本电脑的帮助。这个问题实际上与我在使用COM对象测试解决方案时发现的权限有关:

尽管Queue属性对话框显示了什么,但在未经身份验证的队列中,权限并非完全被忽略,至少在使用多播时。如果您希望队列接收多播消息,则必须向“ANONYMOUS_LOGON”授予“发送消息”的权限。否则,多播消息只是在事件日志中没有任何通知的情况下被丢弃,或者除非我遗漏了什么。

在Win7工作站上(XP工作站似乎做得很好,这就是我指出的实际问题),通过代码创建的队列没有这样的权限,因此必须在创建队列后手动设置:

Dim msgQ = Messaging.MessageQueue.Create(queueName)
msgQ.SetPermissions("ANONYMOUS LOGON",
                    Messaging.MessageQueueAccessRights.WriteMessage)

似乎在内部,MSMQ使用该帐户将多播消息写入未经身份验证的队列。

1 个答案:

答案 0 :(得分:2)

您是否可以创建MSMQDestination类并为其分配多播格式,设置消息标签并使用MSMQMessage类执行发送任务

Dim dest As New MSMQDestination
dest.FormatName = "MULTICAST=234.1.1.1:8001"

Dim message As MSMQMessage
message.label ="Test Message"
message.Send DestinationQueue:=dest

最终字词更新     我很高兴你现在感到宽慰。对于您在其他计算机上的问题,它是一种安全增强功能,可以防止拒绝服务攻击。 default msmq queue permission changed in msmq 4.0