2

所以,我有一个骆驼上下文,DeadLetterChannel在上下文级别没有重新传递。在上下文中,我有一条路线:

from("direct:input")
     .routeId("enrichHeader")
     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

我有一个单元测试,我会在其中interceptSendToEndpoint("direct:output")引发异常。

然后在单元测试中我做producerTemplate.sendBody(theBody)

现在,如上面配置的异常消息被发送到死信通道。一切都好。但是,如果我配置 aloggingErrorHandler我会得到奇怪的行为。因此,如果我将上述路线更新如下:

from("direct:input")
     .routeId("enrichHeader")

     .errorHandler(
        loggingErrorHandler("com.myco.myproject")
             .level(LoggingLevel.WARN))

     .setHeader("myHeader").constant("someValue)
     .to("direct:output");

当我现在运行测试时,我得到了两个意想不到的行为。首先,异常仍然记录在 levelERROR而不是配置的WARN. 其次,异常被传播回producerTemplate.sendBody(theBody)调用。

一方面,日志记录ERROR显然很奇怪。另一个看起来很奇怪的部分是处理程序正在传播异常。我原以为它会将其标记为已处理并完成。

这是预期的行为吗?似乎LoggingErrorHandler缺少文档。

4

1 回答 1

5

LoggingErrorHandler除了记录异常之外什么都不做。如果你想跳过异常,你必须定义一个策略如下

onException(com.myco.myproject.MyException.class).continued(true);

或者你必须在 java中使用doTry()..doCatch()just like块。try{...} catch{...}

例如:

    from("direct:input").routeId("enrichHeader")
    .doTry()
        .setHeader("myHeader").constant("someValue)
        .to("direct:output")
    .doCatch(MyException.class)
        .process(new MYExceptionLoggerAndHandler())
   .end();
于 2013-03-20T00:15:03.403 回答