camel redeliver:如何重新处理来自某个点的消息

时间:2016-05-18 21:09:24

标签: java apache-camel

我想申请重新发送并使用死信频道。所以发现这个非常有用的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"抛出"异常",控件返回"直接:开始",重新尝试从某一点处理消息。

谢谢!

1 个答案:

答案 0 :(得分:1)

我检查了你的代码,只需将两个处理器中的getOut改为getIn,测试就通过了。

编辑:我从一开始就怀疑你的处理器以某种方式覆盖了Camel设置的标题,以便进行一定数量的重新传递。在你的情况下:

CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=3

在getOut交换中设置Body时,标题CamelRedeliveryCounter未递增。在我看来,应该这是一个错误;但也许它按设计工作?也许@ claus-ibsen可以提供帮助。

希望这有帮助。

R上。