Лучшая практика для обработки ошибок с Spring JMS - PullRequest
6 голосов
/ 09 августа 2011

Я работаю над службой сообщений, которая ставит в очередь все входящие запросы и обрабатывает их позже.Какова лучшая практика для обработки ошибок.Например, искаженные сообщения или ошибки связи при отправке информации в следующую систему.

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

Спасибо!

1 Ответ

12 голосов
/ 09 августа 2011

Я думаю, вы на правильном пути. Здесь есть три общих шаблона:

  • Сообщение действительно и может быть обработано.

Применяется нормальная обработка.

  • Сообщение действительно, но не может быть обработано прямо сейчас

Возможно, какой-то ресурс, необходимый для обработки сообщения, недоступен. В этом случае установите транзакцию на rollbackOnly , и сообщение будет доставлено. Надеемся, что ваша реализация JMS поддерживает понятие задержка повторной доставки , чтобы вы не обрабатывали одно и то же сообщение тысячи раз, пока ваш ресурс MIA не станет снова доступным. Если нет (да, я смотрю на вас, WebSphere MQ), то обычно я помещаю сообщение в другую очередь JMS, зарезервированную для временно не обрабатываемых сообщений, и фиксирую. Когда ресурс MIA возвращается в рабочее состояние, я процедурно считываю все сообщения из этой очереди и записываю их обратно в основную [исходную] очередь, где они обрабатываются до завершения.

  • Сообщение недействительно

Подавить исключение и зафиксировать транзакцию. Вы никогда не увидите это сообщение снова. Чтобы сохранить контрольный журнал недействительных сообщений:

  • Запишите недействительное сообщение в очередь bad , где его можно будет просмотреть позже.
  • Выйти из содержимого сообщения
  • Сохранить счетчик недопустимых сообщений JMX (разбит по типу, очереди источника, ошибке синтаксического анализа и т. Д.)

Однако главное - убедиться, что вы зафиксировали транзакцию, если вы знаете , вы никогда не сможете обработать это сообщение.

...