Spring boot 使用Apache Camel和ActiveMQ处理错误-因此中断了exchange的管道

Spring boot 使用Apache Camel和ActiveMQ处理错误-因此中断了exchange的管道,spring-boot,kotlin,error-handling,apache-camel,activemq,Spring Boot,Kotlin,Error Handling,Apache Camel,Activemq,我一直在反复讨论我们系统中的一个问题,即使在论坛上进行了一些研究和一些测试,我们似乎也无法解决这个问题 我会尽量弄清楚我们在处理什么 我们有一个带有路由的主服务,该路由从activemq队列(带嵌入式代理的spring boot)读取数据并将其发送到路由(B),然后将所有内容发送到最终路由(C)。路由(B)依赖于服务 骆驼版本:3.3.0 Spring启动版本:2.3.3.0版本 路线A: onException(Exception::class.java) .hand

我一直在反复讨论我们系统中的一个问题,即使在论坛上进行了一些研究和一些测试,我们似乎也无法解决这个问题

我会尽量弄清楚我们在处理什么

我们有一个带有路由的主服务,该路由从activemq队列(带嵌入式代理的spring boot)读取数据并将其发送到路由(B),然后将所有内容发送到最终路由(C)。路由(B)依赖于服务

骆驼版本:3.3.0 Spring启动版本:2.3.3.0版本

路线A:

 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")
Spring引导activemq配置

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上的错误处理器也不会捕获预期的任何内容,因为之前处理过异常

有没有人有过这样或类似的问题?我知道驼峰和JMS组件之间关于错误处理的一些问题是在过去提出的,但是我们正在努力理解这个问题的根源是什么

提前感谢,,
佩德罗

您可能正在寻找的是路线B例外条款中的继续选项。此选项允许您继续路由到原始路由,就像没有发生异常一样。不要使用已处理的选项,因为它将不允许路由到原始路由,但会中断。 因此,路线B的定义如下:

onException(Exception::class.java)

.continued(true)

.bean(“foo.ErrorProcessor”、“processError”)

from(“直接:我的外部路线”)

.routeId(“我的外部路径”)

.process{something()}


有关更多详细信息,请参阅camel文档: