Я то и дело возвращался с проблемой в нашей системе, которую, несмотря на некоторые исследования на форумах и несколько тестов, мы, похоже, не можем решить.
Я постараюсь как можно яснее объяснить, с чем мы имеем дело.
У нас есть основной сервис с маршрутом, который считывает из очереди activemq (весенняя загрузка со встроенным брокером), отправляет его на Route(B), а затем отправляет все на конечный Route(C). Route(B) зависит от сервиса.
Версия Camel: 3.3.0 Версия Spring-boot: 2.3.3.RELEASE
Маршрут А:
onException(Exception::class.java)
.handled(true)
.bean("foo.ErrorProcessor", "processError")
from("activemq:queue:myqueue")
.routeId("myroute")
.to("direct:my_external_route")
.to(ExchangePattern.InOnly,"direct:myroute_result")
Маршрут Б:
onException(Exception::class.java)
.handled(true)
.bean("foo.ErrorProcessor", "processError")
from("direct:my_external_route")
.routeId("my_external_route")
.process {something()} //This processor can throw exceptions that are treated in our processor
Маршрут С:
from("direct:myroute_result")
.process(someProcess())
.to(ExchangePattern.InOnly,"activemq:queue:results_queue")
Конфигурации ActiveMQ Spring Boot
spring:
jmx:
enabled: true
activemq:
broker-url: vm://localhost?broker.persistent=false,useShutdownHook=false
in-memory: true
non-blocking-redelivery: true
packages:
trust-all: false
trusted: com.mypackage
pool:
block-if-full: true
block-if-full-timeout: -1
enabled: false
idle-timeout: 30000
max-connections: 10
time-between-expiration-check: -1
use-anonymous-producers: true
Все работает очень хорошо и гладко, когда процессоры B не генерируют исключений. Когда это происходит, даже несмотря на то, что они обрабатываются и в теле сообщения возвращается обычный объект, все, что у нас есть в журналах, это
2021-04-10 15:33:32.354 DEBUG [#1 - JmsConsumer[consumerName]] o.a.c.p.Pipeline
: Message exchange has failed: so breaking out of pipeline for exchange: Exchange[ID-1234] Handled by the error handler. {}
Мы даже добавили обработчик ошибок по умолчанию в нашу фабрику соединений activemq, но и там ничего не происходит. У нас есть потребитель DLQ, который тоже ничего не получает. Обработчик ошибок на routeA также не перехватывает ничего ожидаемого, так как исключение было обработано ранее.
Кто-нибудь когда-либо имел эту проблему или что-то подобное? Я знаю, что некоторые проблемы между Camel и компонентом JMS, касающиеся обработки ошибок, возникали в прошлом, но мы изо всех сил пытаемся понять, в чем причина этой проблемы.
Заранее спасибо, Педро