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