Apache Camel: изменить конечную точку при повторной доставке

У меня есть динамическая конечная точка с .recipientList(), и я хочу изменить конечную точку в случае исключения. Вот мой пример:

onException(IOException.class)
 .maximumRedeliveries(2)
 .onRedelivery(urlChangeProcessor)
 .process(failureProccessor);

from("direct:foo")
 .recipientList(simple("cxf:${exchangeProperty.targetUrl}?dataFormat=POJO"));

В исключительных случаях перед повторной доставкой "urlChangeProcessor" обновляет свойство "targetUrl" с правильным URL-адресом, но попытка повторной доставки по-прежнему выполняется на неверный URL-адрес.

Нельзя ли изменить целевую конечную точку при повторной доставке? Если нет, то какое элегантное решение? Мой текущий обходной путь — это doTry/doCatch, изменение свойства в doCatch и повторная отправка его в ту же конечную точку.

Я использую верблюд 2.15.3

Заранее спасибо!


person Steffen E    schedule 24.11.2017    source источник
comment
Я думаю, вам нужно установить исключение как обработанное javaonException(ValidationException) .handled(true);, чтобы верблюд не пытался сделать то же самое, вместо этого используйте процессор изменения URL. Проверьте здесь camel.apache.org/exception-clause.html   -  person pvpkiran    schedule 24.11.2017
comment
Параметр .handled(true) помечает обмен как обработанный, поэтому вызывающая сторона не получает исключение, и обмен может быть перенаправлен на другую конечную точку. Насколько мне известно, это происходит после исчерпания повторных попыток. Но я хочу изменить URL-адрес при каждой попытке повторной доставки.   -  person Steffen E    schedule 24.11.2017
comment
Вы не можете этого сделать, вам нужно будет использовать шаблон динамического маршрутизатора, а затем пересчитать URL-адрес, когда вы обнаружите, что это было заранее созданное исключение.   -  person Claus Ibsen    schedule 25.11.2017
comment
Спасибо @ClausIbsen, тогда я использую свой обходной путь.   -  person Steffen E    schedule 27.11.2017


Ответы (1)


Поскольку это невозможно, в моем случае решение состоит в том, чтобы удалить onException и добавить doTry/doCatch:

from("direct:foo")
 .doTry()
  .to("direct:out")
 .doCatch(IOException.class)
  .process(urlChangeProcessor)
  .to("direct:foo")
 .end();

from("direct:out")
 .recipientList(simple("cxf:${exchangeProperty.targetUrl}?dataFormat=POJO"));

Добавьте некоторые условия, чтобы это не заканчивалось бесконечным циклом.

person Steffen E    schedule 27.11.2017