Я пытаюсь использовать 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 использует эту учетную запись для записи многоадресных сообщений в неаутентифицированные очереди.