Шаблон наблюдателя с WCF MSMQ - PullRequest
3 голосов
/ 30 октября 2008

Возможно ли иметь несколько прослушивателей сообщений, передаваемых MSMQ?

WCF, кажется, создает все с точки зрения услуг, делая общение делом точка-точка. Я хочу использовать очередь сообщений для буферизации входящего трафика для другого процесса, который записывает журналы в базу данных.

Может быть любое количество других процессов, заинтересованных в мониторинге входящего трафика, и это положительно напрашивается на шаблон Observer, но я не понимаю, как выразить шаблон Observer, по крайней мере, не используя MSMQ через WCF.

Может кто-нибудь посоветовать мне это?


Некоторая справка о том, почему я забочусь, что также может служить иллюстрацией проблемы: у меня есть служба Windows, которая принимает запросы на подключение от маленьких чёрных ящиков в поле. Он устанавливает сокеты, и черные ящики отправляют сообщения, описывающие события, отмеченные местоположениями GPS во времени и пространстве.

Я анализирую пакеты сообщений из потока сокетов и отправляю их через MSMQ другому процессу, который фильтрует дубликаты и записывает пакеты в таблицу базы данных.

Существует любая последующая обработка, которая выиграет от дополнительных вычислений в ответ на входящий трафик, а пользовательские инструменты выполняют уведомление пользователей также в ответ на входящий трафик.

Итак, мне бы очень хотелось, чтобы один процесс отправлял сообщения, а несколько - их. Один из этих получателей отвечает за анализ содержимого пакета и запись сообщения в базу данных; это очевидный кандидат на ответственность за окончательное удаление сообщения из очереди, но возникает вопрос, как обеспечить, чтобы это был последний обработчик для обработки сообщения.

Ответы [ 2 ]

3 голосов
/ 30 октября 2008

Я не верю, что MSMQ должным образом спроектирован, чтобы справиться с этой ситуацией самостоятельно. Есть только 2 вещи, которые вы можете сделать с сообщением - Peek () или Get (). AFAIK, нет хорошего способа отследить, были ли сообщения обработаны всеми обработчиками.

Что может сработать, так это чтобы ваш процесс, который расшифровывает сообщение, был Наблюдателем, и опубликовал сообщение (возможно, с использованием архитектуры событий .NET) всем заинтересованным Наблюдателям, прежде чем записывать сообщение и записывать в базу данных. Это обеспечит гарантию того, что все заинтересованные наблюдатели увидят сообщение, и сообщение будет соответствующим образом записано в БД.

0 голосов
/ 25 января 2013

Я думаю, вам нужен канал публикации-подписки :

Как отправитель может передать событие всем заинтересованным получателям? Отправить событие на канале публикации-подписки, который доставляет копию определенного событие для каждого получателя.

Канал публикации-подписки работает следующим образом: у него есть один входной канал который разделяется на несколько выходных каналов, по одному для каждого подписчика. Когда событие публикуется в канале, публикация-подписка Канал доставляет копию сообщения на каждый из выходных каналов. Каждый выходной канал имеет только одного подписчика, которому разрешено только потреблять сообщение один раз. Таким образом, каждый подписчик получает только сообщение раз и использованные копии исчезают с их каналов.

Этот шаблон реализован поверх MSMQ MassTransit и NServiceBus .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...