camel redeliver:如何重新处理来自特定点的邮件

时间:2016-05-20 17:22:28

标签: 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");
}

单元测试:在Exchange Received上,setup会检查正文是否与预期的字符串匹配,然后抛出异常。在路由中,当处理器收到Exchange时,它会抛出异常,但会永远运行...

@Before
public void setUp() throws Exception{
    super.setUp();

    mockResult.whenAnyExchangeReceived(new Processor(){

        @Override
        public void process(Exchange exchange) throws Exception {
            String body = exchange.getIn().getBody(String.class);

            if(body.startsWith("FAIL ALWAYS")){
                throw new Exception("Error publishing message");
            }   
        }

    });
}

@Test
public void failingMessage() throws Exception{
    mockResult.expectedMessageCount(4);
    mockError.expectedMessageCount(1);
    mockError.expectedBodiesReceived("FAIL ALWAYS");

    long startTime = System.currentTimeMillis();
    pTemplate.sendBody("FAIL ALWAYS");
    assertMockEndpointsSatisfied();

    long endTime = System.currentTimeMillis();

    assertTrue(endTime - startTime > 7000);
}

我写了一个简单的单元测试,以触发异常,因此重新执行代码被执行。

现在难度/问题:预期的行为是只进行3次重新传递尝试,延迟时间为1000毫秒,并且ExponentialBackOff。

然而,测试永远运行,继续以指数延迟进行重新传递。如果我删除/注释2个处理器调用,代码运行正常,意味着异常,它只进行3次重试。

你能帮忙理解吗, 1)此代码/路由有什么问题? 2)是什么导致代码永远运行? 3)为什么删除这些处理器,它的工作,重试发生 说的次数只是?

我只想要 - 直到" direct:sub"抛出"异常",控件返回"直接:开始",重新尝试从某一点处理消息。

谢谢!

0 个答案:

没有答案