Итак, у меня есть очередь A для использования сообщения, и после обработки I .stop() отправляется маршрут и ответ. обратно в очередь ответов, указанную в заголовке JMSReplyTo сообщения. transacted имеет значение true, чтобы включить его. Судя по всему, шаблон обмена — InOut, поскольку присутствует заголовок JMSReplyTo. Когда при обработке сообщения возникает ошибка, я выполняю обмен.setRollBackOnly(true), и Camel помещает их обратно в очередь A, и они застревают там, ожидая повторной обработки. Поскольку в конфигурации повторной доставки используется экспоненциальная отсрочка, экспоненциальный множитель отсрочки установлен на 2, сообщения ждут в очереди все дольше и дольше. Это блокирует другие новые сообщения и вызывает проблемы.
Мы хотим отправить повторяющееся сообщение в другую очередь B, когда произойдет первая ошибка, и позволить повторной попытке произойти только там, но мы видим некоторые трудности. :
- если transacted = true, даже повторная попытка происходит только во 2-й очереди, исходные сообщения не удаляются; кажется, что транзакция имеет охват всех очередей, и только когда ответ будет отправлен наконец, исходное сообщение будет удалено.
- но если я изменю transacted = false, повторная попытка не произойдет; после обмена.setRollbackOnly(true), выходя из этого Бена, сообщение не возвращается в очередь, оно просто потребляется и исчезает.
Какой-то псевдокод:
from("activemq:queue:A")
.bean(Validator.class)
.bean(BusinessBean.class)
.stop(); // sending reply here
Исходно в BusinessBean.class:
...
if (caught instanceof SomeException) {
exchange.setRollbackOnly(true); // leaving this bean, route rolled back and pushed back to queue
return;
}
Теперь изменено на:
if (caught instanceof SomeException) {
exchange.getIn().setBody(originalMessage);
exchange.setHeader("retry", true);
return;
}
и:
from("activemq:queue:A")
.bean(Validator.class)
.bean(BusinessBean.class)
.choice()
.when(simple("${header.retry} == true")
.to("activemq:queue:B") // move to retry queue
.endChoice()
.otherwise()
.stop() // sending reply here
.endChoice()
.end();
Подробнее здесь: https://stackoverflow.com/questions/783 ... -2nd-queue