Что-то, заставляющее NServiceBus терять сообщения - PullRequest
2 голосов
/ 20 марта 2012

У меня есть конфигурация NServiceBus, которая отлично работает на машинах разработчиков и в моей среде разработки.

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

Вот система:

  1. Приложение получает сообщение TCP от системы мэйнфрейма и отправляет его в MSMQ (назовите его FromMainframe).
  2. Приложение, размещенное в IIS, имеет метод «Handle» для этого MSMQ и обрабатывает сообщения от мэйнфрейма.

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

Фактически мои данные LOST ! NServiceBus удаляет их из очереди, но я так и не смог обработать их. Их даже нет в очереди ошибок!

Это то, что я пробовал , пытаясь выяснить, что происходит:

  1. Проверьте файлы конфигурации
  2. Подключите удаленный отладчик к процессу, чтобы увидеть, что делает метод Handle
    • Метод Handle никогда не вызывается (но когда я присоединяюсь к среде разработки, достигается моя точка останова в моем методе Handle, и все это работает безупречно).
  3. Повторно разверните мою версию Dev в Test Envioronment и попробуйте снова выполнить шаг 2 (на случай, если версии не совсем совпадают.)
  4. Проверьте файлы конфигурации еще раз
  5. Убедитесь, что очередь ошибок не заполняется
    • Очередь ошибок остается пустой (хотелось бы, чтобы она заполнилась, тогда мои данные не были бы потеряны).
  6. Проверьте, нет ли других процессов, которые могут вызывать данные из моих MSMQ.
    • Я выключил свой веб-сайт IIS, и сообщения в очереди FromMainframe начали резервное копирование.
    • Когда я снова включаю его, сообщения исчезают довольно быстро (но все же не все сразу). Скорость, с которой они исчезают, слишком велика, чтобы их можно было обработать моим Handle методом.
  7. Еще раз проверьте файлы конфигурации.
  8. Запустите NServiceBusTools \ MsmqUtils \ Runner.exe \ i
    • Я запустил его, перезагрузил, снова и снова запускал для хорошей меры!
  9. Проверьте Конфиги еще раз (я, должно быть, что-то пропустил, верно?)
  10. Проверьте, что среды разработки не указывают на среду тестирования.
    • Я не думаю, что можно использовать MSMQ другого компьютера в качестве входной очереди, но это не помешает проверить.
  11. Ищите любые блоки catch, которые могли бы молча убить мое сообщение.
  12. Последняя проверка файлов конфигурации.
  13. Воссоздать мою тестовую среду на другом компьютере (она работала безупречно)
  14. Запустить мои вещи за пределами IIS.
    • Когда я размещаю за пределами IIS (используя NServiceBus.Host.exe), все работает нормально. Значит, это должна быть вещь IIS, верно?
  15. Go сумасшедший и надеемся, что переполнение стека может предложить любой вид понимания.

1 Ответ

2 голосов
/ 21 марта 2012

Итак, я достаточно знаю о том, что случилось, чтобы выбросить «Ответ».

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

NServiceBus.Configure.With().LoadMessageHandlers()

(Есть больше конфигураций, но я для краткости опущу их)

Когда вы вызываете это, NServiceBus сканирует ассемблеры для класса, который реализует IHandleMessages<T>.

Итак, каким-то образом на моей машине тестовой среды сканирование ServiceBus каталога на предмет класса, который вызывает IHandleMessages, не смогло найти мой класс (даже если сборка была абсолютно там).

Оказывается, что если NServiceBus не найдет что-то, что обрабатывает сообщение, оно будет БРОСИТЬ ЭТО ВПЕРЕДИ !!!

Это, на мой взгляд, общая ошибка проектирования . Вся идея NServiceBus состоит в том, чтобы не потерять ваши данные, но в этом случае он делает именно это!

Теперь, когда вы узнаете об этой ловушке, есть несколько способов ее обойти.

  1. Четко укажите, какими должны быть ваши обработчики:

    NServiceBus.Configure.With().LoadMessageHandlers<First<MyMessageType>>()

  2. Еще одна защита - добавить еще один обработчик, который будет обрабатывать «Все остальное». IMessage является базой для всех полезных нагрузок сообщений, поэтому, если вы добавите обработчик, он получит все.
    Если вы установите IMessage на handle после обработки ваших сообщений, то он будет обрабатывать все, для чего NServiceBus не может найти обработчик. Если вы выбрасываете исключение в этом Handle методе, который заставит NServiceBus переместить сообщение в очередь error. (То, что я думаю, должно быть поведение по умолчанию .)

...