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
异常的理解不正确?如果是这样,正确的方法是什么?
我不知道这是设计还是一个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