Общепринято, что лучше не «записывать» сообщение в очередь недоставленных сообщений, а «откатывать» его обратно, используя транзакционный сеанс.
В вашем проекте вы будете иметь бесконечный цикл постоянного потребления и предварительной публикации сообщений в очереди недоставленных сообщений в случае сбоя БД. Лучше всего отключить эту функцию по таймеру (запускать ежечасно и т. Д.) ... или иметь какую-то логику отключения, чтобы остановить постоянный опрос DLQ во время сценария ошибки.
Общая обработка фиксации и отката одного сеанса за один сеанс с надлежащей процедурой закрытия объекта в блоке finally.
Session session = connection.createSession(true, Session.TRANSACTED);
MessageConsumer consumer = session.createConsumer(session.createQueue('MY.QUEUE.DLQ');
Message m = mconsumer.receive(3000L);
while (m != null) {
try {
sendMessageToDB(m);
session.commit();
m = messageConsumer.receive(3000L);
} catch (DBException ex) {
session.rollback();
logger.error("Rolling back messageId {} due to database error {}", m.getJMSMessageId(), ex);
} finally {
if(consumer != null) {
try { consumer.close(); } catch (JMSException e) { logger.error("Error closing consumer.."); }
}
if(session != null) {
try { session.close(); } catch (JMSException e) { logger.error("Error closing session.."); }
}
if(connection != null) {
try { connection.close(); } catch (JMSException e) { logger.error("Error closing connection.."); }
}
}
}