当前位置: 首页 > 知识库问答 >
问题:

使用Apache Camel和ActiveMQ进行错误处理-因此突破管道进行交换

曹波鸿
2023-03-14

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

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

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

骆驼版:3.3.0Spring靴版:2.3.3。发布

路线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")

路线B:

 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

路线C:

from("direct:myroute_result")
      .process(someProcess())
      .to(ExchangePattern.InOnly,"activemq:queue:results_queue")

Spring Boot 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组件之间在错误处理方面存在一些问题,但我们很难理解这个问题的根源是什么。

先谢谢你,佩德罗

共有1个答案

傅兴平
2023-03-14

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

onException(Exception::class.java)
.继续(true)
. bean("foo. ErrorProcess","Process Error")

来自(“direct:my\u external\u route”)
。routeId(“my\u external\u route”)
进程{something()}有关更多详细信息,请参阅camel文档:camel EXCEPTION子句

 类似资料:
  • Promise 链在错误(error)处理中十分强大。当一个 promise 被 reject 时,控制权将移交至最近的 rejection 处理程序(handler)。这在实际开发中非常方便。 例如,下面代码中所 fetch 的 URL 是错的(没有这个网站),.catch 对这个 error 进行了处理: fetch('https://no-such-server.blabla') // re

  • 问题内容: 我实际上发现了Spring,并且能够设置一些作业。现在,我想使用Hibernate / JPA将导入的数据保存在数据库中,并且不断出现此错误: 我看到问题出在交易上。这是我的和的春季java配置: 我正在使用JpaItemWriter将数据存储在数据库中: 这是导致异常的代码: 有什么想法可以解决这个问题吗? [编辑]我还要输入Job定义和step定义。我所有的Spring配置都是用J

  • 问题内容: 我在Swift中使用,需要获取更好的错误消息。 在调试描述中(例如),我可以看到诸如“给定数据不是有效的JSON”之类的消息,但是我需要知道的是,而不是网络错误(例如)。 我尝试将其强制转换为,但这似乎并未显示更多信息。我当然不需要字符串-甚至错误代码也比这有用得多… 问题答案: 切勿在解码块中打印。这将返回一个毫无意义的通用错误消息。始终打印实例。然后,您会得到所需的信息。 或针对

  • 问题内容: 我正在使用具有以下功能的simplehtmldom: 我这样使用它: 有时,URL可能只是无效的,我想对此进行处理。我以为我可以使用try and catch,但是这没有用,因为它不会抛出异常,它只是给出了这样的php警告: 第39行在上面的代码中。 我如何正确处理此错误,我可以只使用普通条件,它看起来不像返回布尔值。 谢谢大家的帮助 更新资料 这是一个好的解决方案吗? 问题答案: 这

  • 我想测试以下骆驼路线。我在网上找到的所有例子都有以文件开头的路由,在我的例子中,我有一个Springbean方法,每隔几分钟就会被调用一次,最后消息被转换并移动到jms以及审计目录。 我对这条路线的写测试毫无头绪。目前我在测试用例中所拥有的是

  • 我的Spring批处理作业每3分钟运行一次。 步骤应为 每个用户的记录应该并行执行。每个用户最多可以有150k条记录。 每个用户都可以有更新和删除记录。更新记录应在删除之前运行。 更新/删除集应该自己并行运行。但严格来说,所有更新都应该在删除之前完成。 有谁能提出在多个级别实现并行性的最佳方法,并遵循更新和删除级别的顺序吗。我正在研究Spring异步执行器服务、并行流和其他Spring库。Rx,仅