我想申请重新发送并使用死信频道。所以发现这个非常有用的apache-camel FAQ link。我按照本网站提到的步骤进行了操作。
我添加了更多逻辑,代码在github中可用。
基本上,根据常见问题解答,我们必须拆分路由,以便(如FAQ中所述)驼峰可以处理子路由中的任何异常。 这是代码(Camel Route):
@Override
public void configure() throws Exception {
errorHandler(deadLetterChannel("mock:error")
.logExhaustedMessageBody(true)
.logExhausted(true)
.logRetryStackTrace(true)
.maximumRedeliveries(3)
.redeliveryDelay(1000)
.backOffMultiplier(2)
.useOriginalMessage()
.useExponentialBackOff());
from("direct:start")
.log("Dump incoming body: " + body())
.to("direct:sub")
.end();
from("direct:sub")
.errorHandler(noErrorHandler())
.process(new SubRouteProcessor())
.log("Dump incoming body: "+ body())
.process(new NewSubRouteProcessor())
.transform(body().append("Modified Data !"))
.to("mock:result");
}
我写了一个简单的单元测试,以触发异常,因此重新执行代码被执行。
现在难度/问题:预期的行为是只进行3次重新传递尝试,延迟时间为1000毫秒,并且ExponentialBackOff。
然而,测试永远运行,继续以指数延迟进行重新传递。如果我删除/注释2个处理器调用,代码运行正常,意味着异常,它只进行3次重试。
你能帮忙理解吗, 1)此代码/路由有什么问题? 2)是什么导致代码永远运行? 3)为什么删除这些处理器,它的工作,重试发生 说的次数只是?
我只想要 - 直到" direct:sub"抛出"异常",控件返回"直接:开始",重新尝试从某一点处理消息。
谢谢!
答案 0 :(得分:1)
我检查了你的代码,只需将两个处理器中的getOut改为getIn,测试就通过了。
编辑:我从一开始就怀疑你的处理器以某种方式覆盖了Camel设置的标题,以便进行一定数量的重新传递。在你的情况下:
CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=3
在getOut交换中设置Body时,标题CamelRedeliveryCounter未递增。在我看来,应该这是一个错误;但也许它按设计工作?也许@ claus-ibsen可以提供帮助。
希望这有帮助。
R上。