2016-05-13 4 views
0

Неужели NServiceBus, в любой момент, по какой-либо причине должен опубликовать сообщение пустым сообщениям в MSMQ, и если да, то почему и когда это происходит? Дальнейшее объяснение ниже.Почему NServiceBus отправляет пустые сообщения в MSMQ?

Проект, над которым я работаю, использует версию NServiceBus 4. Эта версия не позволяет «много хостинг» обработчиков событий для разных очередей в одном процессе, что может быть неудобно, если ваш проект содержит 40 или около того разных очередей ,

Чтобы преодолеть эту проблему при разработке, я сделал небольшое приложение «router», которое прослушивает все необходимые очереди MSMQ и просто пересылает все сообщения из них в одну «унифицированную» очередь. Эта «унифицированная» очередь указывается как имя очереди для процесса «единой конечной точки», которая ссылается на все обработчики для всех сообщений, которые обычно обрабатываются из этих различных очередей.

Установка добрейшей работ, кажется, (с большинством обработчиков, по крайней мере), но есть одна загадочная поведение (что, я полагаю, может что-то делать с установкой не работы с некоторыми другие обработчики). А именно, как только проект запустится, мой «маршрутизатор» сразу обнаруживает несколько пустых сообщений MSMQ, отправленных в очереди, которые он должен прослушать. По всей видимости, NSB публикует эти сообщения во время запуска по какой-то причине (и, скорее всего, маршрутизатор выдает их, прежде чем NSB сможет снова взглянуть на них).

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

ответ

3

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

Механика за подписными сообщениями документирована here. TL; DR для транспортов, которые не предоставляют публикацию изначально (например, MSMQ, очереди хранения Azure). NServiceBus эмулирует ее с использованием подписей сообщений и внутренних списков подписки (хранилищ).

Вы можете проверить это, проверив заголовок message intent. Если они не подписываются на сообщения, пожалуйста, поделитесь полным списком заголовков такого сообщения для дальнейшего расследования.

+0

Спасибо, я посмотрю в заголовке, как только доберусь до него. Но тогда мой вопрос здесь немного глубже - почему сообщения действительно «отправляются» здесь (до того, чтобы быть отправленным моему внешнему слушателю)? Является ли требование MSMQ отправлять такое сообщение? Есть ли какая-либо спецификация, которая говорит что-то об этих «подписных» сообщениях, для кого они предназначены и как они предназначены для обработки третьей стороной, которая их получает? –

+1

Я отредактировал свой ответ, чтобы включить эту информацию. –

+0

Отлично, спасибо. Ссылка на добавленные вами документы (странно, что я не нашел ее сам, я был уверен, что все прочитал) объясняет все, что я искал! –

Смежные вопросы