Использование многоадресных очередей в System.Messaging и MSMQ 3.0

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


person T. Fabre    schedule 21.12.2011    source источник
comment
Кроме того, ограничение сети показывает, что все сообщения правильно отправляются по многоадресному адресу ... Но кажется, что по какой-то причине очереди, связанные с многоадресным адресом, не получают отправленные сообщения.   -  person T. Fabre    schedule 21.12.2011
comment
вы установили \ private $ \ myQ в нетранзакционную очередь. Возможности многоадресной рассылки MSMQ 3.0 работают только для нетранзакционных очередей.   -  person Turbot    schedule 21.12.2011
comment
Да, я только что перепроверил. Подводя итог: * На каждой машине включен только один сетевой адаптер (чтобы убедиться, что это не связано с проблемами привязки IP), и все машины находятся в одной подсети * Брандмауэр отключен на всех рабочих станциях * Каждая локальная очередь не является транзакционной, и принадлежит активному пользователю. У каждой очереди также есть свойство многоадресной рассылки, настроенное на адрес, указанный в сообщении. * Сообщения ДОЛЖНЫ быть отправлены (проверяются путем мониторинга исходящих очередей и сетевого трафика), они просто не доходят до других очередей.   -  person T. Fabre    schedule 21.12.2011
comment
Чтобы уточнить, на отправляющем компьютере также есть локальная очередь, подписывающаяся на многоадресный адрес, и отправленные сообщения поступают в эту очередь, да? Это означает, что сообщения отправляются успешно и должны быть доставлены. Если это так, то это не проблема программирования. Вы упоминаете, что захват сети показывает трафик - вы захватываете на отправителе или на другом компьютере (желательно на последнем)?   -  person John Breakwell    schedule 21.12.2011
comment
Да, верно, но сообщения никогда не попадали ни в одну очередь, даже на отправляющую машину. На самом деле это вопрос разрешений ... См. Мой исходный вопрос для исправления ...   -  person T. Fabre    schedule 21.12.2011
comment
Нет, мои сообщения состоят из 6-ти символьных строк   -  person T. Fabre    schedule 21.12.2011
comment
Примечание. ReceiveQueue.MulticastAdress = 234.1.1.1:8001 (введено неверно выше) используется только при создании очереди.   -  person John Breakwell    schedule 21.12.2011
comment
Спасибо за подсказку ... За опечатку, ну в реальном коде она написана правильно :)   -  person T. Fabre    schedule 21.12.2011


Ответы (1)


Не могли бы вы создать класс 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

ЗАКЛЮЧИТЕЛЬНОЕ ОБНОВЛЕНИЕ СЛОВА. Я рад, что теперь вам стало легче. для вашей проблемы на другой машине, это усиление безопасности для предотвращения атаки отказа в обслуживании. разрешение очереди msmq по умолчанию изменено в msmq 4.0

person Turbot    schedule 21.12.2011