Обработка ошибок с помощью Apache Camel и ActiveMQ — выход из конвейера для обмена

Я то и дело возвращался с проблемой в нашей системе, которую, несмотря на некоторые исследования на форумах и несколько тестов, мы, похоже, не можем решить.

Я постараюсь как можно яснее объяснить, с чем мы имеем дело.

У нас есть основной сервис с маршрутом, который считывает из очереди 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, касающиеся обработки ошибок, возникали в прошлом, но мы изо всех сил пытаемся понять, в чем причина этой проблемы.

Заранее спасибо, Педро


person NokusFerreira    schedule 10.04.2021    source источник


Ответы (1)


Возможно, вам нужна опция продолжение в вашем пункте об исключении маршрута B. Этот параметр позволяет продолжить маршрутизацию по исходному маршруту, как если бы исключения не произошло. Не используйте параметр handled, так как он не позволит перейти к исходному маршруту, а прорвется. Таким образом, ваш маршрут B должен быть определен примерно так:

onException(Exception::class.java)
.continued(true)
.bean("foo.ErrorProcessor", "processError")

from("direct:my_external_route")
.routeId("my_external_route")
.process {something()}

Дополнительные сведения см. в документации по верблюдам: ИСКЛЮЧЕНИЕ ДЛЯ CAMEL

person Avijit Gupta    schedule 22.04.2021