Повторная доставка сообщений - это просто поведение по умолчанию для вашей [сконфигурированной] реализации JMS. Это бесконечная дискуссия о том, какова относительная полезность этого, но может показаться, что вместо отбрасывания сообщения с некоторыми потенциально невосстановимыми данными, некоторая повторная попытка является разумным и консервативным подходом. Например, в вашем случае вы, кажется, конвертируете сообщение JMS в сообщение электронной почты и отправляете его на SMTP-сервер. Если шлюз SMTP не работает, вы можете удерживать сообщения JMS и повторно обрабатывать их, когда шлюз возвращается.
В целом, я бы сказал, что ваши варианты обработки сообщения, которое не удалось обработать (в зависимости от реализации JMS):
- Откажитесь от сообщения.
- Написать сообщение в очередь ошибок.
- Повторное получение сообщения после задержки n секунд.
- Повторно доставить сообщение n раз, а затем записать сообщение в очередь ошибок.
- Повторно доставить сообщение после задержки n секунд x раз, а затем записать сообщение в очередь ошибок.
Если вы предпочитаете # 1, просто отмените исключение, подтвердите транзакцию и прощайте сообщение. В остальном конфигурация JMS (или конкретная конфигурация назначения) должна обрабатывать их.
Кроме того, если вы хотите что-то более конкретное, вы можете запросить getJMSRedelivered () сообщения и / или свойство заголовка сообщения для конкретной реализации, которое указывает, сколько раз сообщение было доставлено (поддерживается большинством JMS реализации, но не стандартные) и соответственно распоряжаться сообщением.