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