Итак, я достаточно знаю о том, что случилось, чтобы выбросить «Ответ».
Когда я настраивал свой собственный хостинг NServiceBus, мне позвонил, который загрузил обработчики сообщений.
NServiceBus.Configure.With().LoadMessageHandlers()
(Есть больше конфигураций, но я для краткости опущу их)
Когда вы вызываете это, NServiceBus сканирует ассемблеры для класса, который реализует IHandleMessages<T>
.
Итак, каким-то образом на моей машине тестовой среды сканирование ServiceBus каталога на предмет класса, который вызывает IHandleMessages, не смогло найти мой класс (даже если сборка была абсолютно там).
Оказывается, что если NServiceBus не найдет что-то, что обрабатывает сообщение, оно будет БРОСИТЬ ЭТО ВПЕРЕДИ !!!
Это, на мой взгляд, общая ошибка проектирования . Вся идея NServiceBus состоит в том, чтобы не потерять ваши данные, но в этом случае он делает именно это!
Теперь, когда вы узнаете об этой ловушке, есть несколько способов ее обойти.
Четко укажите, какими должны быть ваши обработчики:
NServiceBus.Configure.With().LoadMessageHandlers<First<MyMessageType>>()
Еще одна защита - добавить еще один обработчик, который будет обрабатывать «Все остальное». IMessage
является базой для всех полезных нагрузок сообщений, поэтому, если вы добавите обработчик, он получит все.
Если вы установите IMessage на handle после обработки ваших сообщений, то он будет обрабатывать все, для чего NServiceBus не может найти обработчик. Если вы выбрасываете исключение в этом Handle
методе, который заставит NServiceBus переместить сообщение в очередь error
. (То, что я думаю, должно быть поведение по умолчанию .)