Apache Camel - при первом сбое помещается в очередь повторных попыток и повторяется только во второй очереди, транзакцияJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Apache Camel - при первом сбое помещается в очередь повторных попыток и повторяется только во второй очереди, транзакция

Сообщение Anonymous »

Мне необходимо обработать откатываемое сообщение в другой очереди, отличной от исходной. Как это можно сделать в ActiveMQ + Apache Camel?
Итак, у меня есть очередь 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»