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

将exchange标记为基于表达式的已处理的事务Camel路由不起作用

戚明朗
2023-03-14
package com.my.comp.playground;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;

@Component
public class MyRouteBuilder extends RouteBuilder {
    @Override
    public void configure() {
        onException(Exception.class)
                .process(new Processor() {
                    private int failureCounter = 0;
                    @Override
                    public void process(Exchange exchange) {
                        exchange.getIn().setHeader("failureCounter", ++failureCounter);
                    }
                })
                .log("failureCounter = ${header.failureCounter}")
                //.handled(true);
                .handled(header("failureCounter").isGreaterThan(3));

        from("jms:test.queue")
                .routeId("test-route")
                .transacted()
                .process(exchange -> {
                    throw new RuntimeException("No good Pal!");
                })
                .to("mock:discard");
    }
}

因此,我试图做的是保留一个失败的计数器,如果该计数器大于某个数字,则将异常标记为已处理并提交事务。

注意异常处理结尾的两行代码:

 //.handled(true);
 .handled(header("failureCounter").isGreaterThan(3));

当我使用标头(“failureCounter”).isgreaterthan(3)处理的条件运行路由时,消息会一次又一次地永远回滚,我可以在日志中看到failureCounter正确地增加:

...
[mer[test.queue]] test-route                               : failureCounter = 402
[mer[test.queue]] o.a.c.p.e.DefaultErrorHandler            : Failed delivery for (MessageId: ...
...
[mer[test.queue]] test-route                               : failureCounter = 403
...
[mer[test.queue]] test-route                               : failureCounter = 404
...
[mer[test.queue]] test-route                               : failureCounter = 1
[mer[test.queue]] o.a.c.s.spi.TransactionErrorHandler      : Transaction commit (0x52b2f795) redelivered(true)

所以我的问题是:是我做错了什么,还是我对如何使用handled异常的理解不正确?如果是这样,正确的方法是什么?

共有1个答案

盛琪
2023-03-14

我不知道这是设计还是一个bug。

当我调试您的案例时,我看到handled()中的谓词是根据Camel Exchange计算的。

但是,FailureCounter标头不在Exchange中。因此,表达式标头(“failurecounter”)的计算结果为null,谓词始终为false

 类似资料:
  • 我正在尝试获得骆驼路线JMS- 下面的例子说明了如果REST服务的服务器出现故障而无法交付route时会发生什么情况。 我得到了正确的例外: 但是消息被消费并从队列中删除。我的假设是使用事务/事务骆驼和AMQ可以解决这个问题并将消息移动到ActiveMQ.DLQ. 我已经阅读了《骆驼行动》第一版的第9章,并在谷歌上搜索,但没有找到任何解决我问题的方法。 我知道我可以创建/定义自己的Transact

  • 我可以检查对象中的值并基于此进行路由吗(就像写到不同的文件一样?)。我可以在pojo中添加注释以避免final json中的字段 我想到了将object转换为json,然后发送到Queue。然后我可以使用jsonpath进行条件路由。但是,我怎样才能从final JSON中省略一个字段呢?

  • 我试图用ApacheCamel和Spring Boot编写我的第一个项目。它应该调用Restendpoint并处理数据,但从未调用我的处理器。我做错了什么? 日志显示路由已启动并且它从“Direct://httpRoute”中消耗。但在最后没有日志表明调用了MyProcess。 pplication.java 我的路线。JAVA pom.xml 日志

  • 本文向大家介绍C#Lambda表达式作为事件处理程序,包括了C#Lambda表达式作为事件处理程序的使用技巧和注意事项,需要的朋友参考一下 示例 Lambda表达式可用于处理事件,在以下情况下非常有用: 处理程序很短。 处理程序永远不需要取消订阅。 下面给出了一个可能使用lambda事件处理程序的良好情况: 如果有必要在代码的某个将来点取消订阅已注册的事件处理程序,则应将事件处理程序表达式保存到一

  • 问题内容: 我们有一些使用方路径(ftp,file,smb)从远程系统读取文件。简化了直接路径测试,但与批处理使用者的行为类似: 转换后,一次轮询的所有结果将在单独的路径中按批汇总: 如果每个消费者分开运行,则一切正常。但是,如果多个使用者并行运行,聚合将拆分民意测验。例如,如果文件消费者轮询500条消息,并且第二条路线开始从ftp读取6个文件,则期望得到2个聚合1,其中包含来自文件的500条消息

  • 下面是我的代码片段: 现在java用'unhandled exception type SQLException)标记指示语句(以及后面的所有语句)。gfsql.dosql抛出此异常并定义为: public ResultSet doSQL(String sqlCommand)抛出SQLException{ 有趣的是--如果我像这样重复“catch”块: 未标记“未处理”错误。(但是,重复的catc