Как добавить зависимость от службы к универсальному хосту NServiceBus

#c# #.net #windows-services #msmq #nservicebus

#c# #.net #windows-службы #msmq #nservicebus

Вопрос:

У меня есть следующий макет служб:

  • Служба интерфейса (генерирует команды из запросов WCF, запросов TCP, опроса и т. Д.)
  • Рабочая служба (использует команды, сгенерированные службой интерфейса, и публикует события)
  • Служба обработчика событий (обрабатывает события, сгенерированные рабочей службой)

Я использую хранилище подписки MSMQ.

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

Моя первая идея — добавить зависимость от службы обработки событий.

Как бы я это сделал, используя общий хост, предоставляемый NServiceBus? Есть ли лучший способ решить проблему?

Ответ №1:

Если вы используете MSMQ в качестве хранилища подписки, сделайте транзакционную очередь подписки.

Тогда сообщения о подписке от службы обработчика событий останутся в очереди подписки на рабочую службу даже после перезапуска.

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

Обновить

На самом деле это строго неверно, потому что превращение очередей в транзакционные даст вам долговечность при перезапуске сервера.

Вы все равно должны получить то же поведение, которое я описал выше, с нетранзакционными очередями.

Комментарии:

1. Я постараюсь сделать очереди транзакционными. Я должен что-то добавить .IsTransactional(true) в конфигурацию fluent, верно?

2. Да, или производный от AsA_Server. Однако я кое-что понял, см. Обновление моего первоначального ответа.

3. Я изменил свойство IsTransactional, но, похоже, оно не изменилось. Завтра я изучу эту проблему более глубоко.

Ответ №2:

Я бы рекомендовал использовать опцию подписки на БД. Это позволит сохранить ваши подписки.