2010-12-16 2 views
1

Ну, я делал этот проект NServiceBus какое-то время, и как только я получил его для PubSub, я тогда остался в реальной логике рабочего процесса. Тем не менее, я вижу серьезную проблему, которую я хочу обойти (или, скорее, научиться правильно обращаться).NServiceBus pub/sub - где мои сообщения ушли?

Издатель публикует сообщение в очереди хранения любых подписчиков, насколько я понимаю. Отлично. Но что происходит, когда абонент не работает (я читал другие сообщения об этом, и они, похоже, не задают один и тот же вопрос).

Сценарий - я получаю публикацию для публикации сообщения, когда подписчики не работают (прикрепленные/запрошенные сообщения для их передачи). Затем я обнаружил, что .. сообщение «ушло» просто не существует ! куда он пошел? Издатель сказал: «Эй, никто не подписывается на это, так что я не буду публиковать его?», Разве он не должен делать этого и требует хотя бы одного абонента?

Может ли кто-нибудь пролить свет на это? (nservicenewbie)

+0

Итак, из того, что я понимаю до сих пор, это не обязательно ошибка, при которой ни один из подписчиков не будет «прикреплен». Однако в моем сценарии реальной жизни вам нужно запустить издателя (который читает сообщения для публикации), а затем подписчика. Перед началом подписки издатель мог опубликовать кучу сообщений! так что .. они в основном потеряны, а действия рабочего процесса «заперты» в каком-то статусе «в процессе». Я мог бы изменить метод публикации nServiceBus .. но я действительно не хочу ... – MRAH

ответ

4

Вы должны опубликовать событие, которое произошло - утверждение о том, что другой обработчик может заинтересовать или не быть заинтересованным. действительный, чтобы иметь нулевых подписчиков! Если это не так, возможно, вам следует отправить() команду вместо публикации() события.

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

Если вы просто тестируете NServiceBus, NServiceBus.Host.exe работает в профиле Lite, который использует хранилище подписей в памяти (непостоянное), что приведет к тому, что вы видите.

+0

Спасибо за Дэвида - как я могу узнать, работает ли exe exe в профиле Lite? – MRAH

+0

К вашему вопросу о методе отправки - да, похоже, что я должен использовать Send. Однако, если вы говорите, что в режиме, отличном от Lite, эти опубликованные сообщения будут просто накапливаться в очереди, если абонент (локальный) отключен, тогда этот подход должен быть хорошим. – MRAH

+0

Профиль выбирается аргументами командной строки.Если вы не указали ни один, Lite является значением по умолчанию. См. Http://www.nservicebus.com/Profiles.aspx –

3

Ах, ха! Ну, хотя это не всегда ошибка, когда нет подписчика на тип сообщения, есть способ справиться с этим.

В издателю просто модифицировать:

IBus Bus 

Для использования (требуется NServiceBus.Core.dll и NS NServiceBus.Unicast):

IUnicastBus Bus 

Затем вы можете прикрепить обработчик до:

Bus.NoSubscribersForMessage += ....... 

Это может затем отправить сообщение в очередь ошибок .. или, возможно, повторить попытку навсегда .. или опубликовать s omething еще и т. д. и т. д., что бы вы ни пожелали. Таким образом, нет ничего потерянного, если ваша конкретная система (с точки зрения бизнеса) требует результата

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