Я пытаюсь использовать 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.
Кроме того, неясно, должен ли я использовать локальную очередь на рабочую станцию или одну удаленную очередь на сервере для многоадресной рассылки сообщений? И удаляет ли использование метода приема для многоадресных сообщений их из очереди?
Любая помощь, советы, подсказки, все, что угодно ... будет приветствоваться.
Кстати, все рабочие станции находятся в одной подсети, и на всех установлен MSMQ 3.0.
Последнее слово
Хорошо, спасибо ноутбук за помощь. На самом деле проблема была связана с разрешениями, которые я обнаружил при тестировании вашего решения с COM-объектами:
Несмотря на то, что говорит диалоговое окно свойств очереди, разрешения НЕ полностью игнорируются в неподтвержденных очередях, по крайней мере при использовании многоадресной рассылки . Если вы хотите, чтобы ваша очередь получала многоадресные сообщения, она должна предоставить ANONYMOUS_LOGON право «Отправлять сообщения». В противном случае многоадресные сообщения просто отбрасываются без какого-либо уведомления в журналах событий или чего-либо еще (если я что-то пропустил).
На станциях Win7 (кажется, что со станциями XP все в порядке, что и указывает на реальную проблему), очереди, созданные с помощью кода, не имеют таких разрешений и, следовательно, должны быть установлены вручную после создания очереди:
Dim msgQ = Messaging.MessageQueue.Create(queueName)
msgQ.SetPermissions("ANONYMOUS LOGON",
Messaging.MessageQueueAccessRights.WriteMessage)
Может показаться, что внутри MSMQ использует эту учетную запись для записи многоадресных сообщений в неаутентифицированные очереди.