Camel useOriginalMessage不起作用

时间:2016-04-18 10:10:14

标签: java apache-camel

生成输入体的第一个路径。

    from("timer://bar?fixedRate=true&period=10000s")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    exchange.getIn().setBody("some message");
                }
            }).to("direct:dummydata");

抛出异常并通过onException捕获它的第二个路径。

onException(RuntimeException.class)
            .useOriginalMessage()
            .handled(true)
            .log("after catching: ${body}");

    from("direct:dummydata")
            .log("before exception: ${body}.")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    throw new RuntimeException("some exception");
                }
            });

预期: 异常之前:一些消息。 在捕捉之后:一些消息。

现实:

2016-04-18 18:08:02.342  INFO 5659 --- [0 - timer://bar] route2                                   : 
before exception: some message.
2016-04-18 18:08:02.345  INFO 5659 --- [0 - timer://bar] route2                                   : 
after catching: 
2016-04-18 18:08:02.349 ERROR 5659 --- [0 - timer://bar] 
o.a.camel.processor.DefaultErrorHandler  : Failed delivery for 
(MessageId: ID-sdcit001mac-49629-1460974079807-0-1 on ExchangeId: 
ID-sdcit001mac-49629-1460974079807-0-2). Exhausted after delivery attempt: 
1 caught: java.lang.RuntimeException: some exception. Processed by failure processor: 
FatalFallbackErrorHandler[Channel[Log(route2)[after catching: ${body}]]]

为什么useOriginalMessage()无效?

2 个答案:

答案 0 :(得分:3)

问题似乎是使用“直接:”。如果您将其更改为“direct:vm”,您应该看到所需的结果。

也许潜在的原因与“直接:”被处理的关系几乎就像是从第一条路线直接调用,因此意味着一个空的起始体(来自计时器)。

答案 1 :(得分:2)

因为,我看到你有3条路线

  1. 开始路线。的定时器
  2. 包括处理器在内的路线。的直接:dummydata
  3. 例外路线。的 RuntimeException.class
  4. 很简单。我修改了你的问题。

    1. 开始时,您的正文消息为空。
    2. 而且,我发现你正在使用.useOriginalMessage(),这意味着在这种情况下使用路径起点中存在的完全相同的消息 NULL 。当您评论或删除.useOriginalMessage()时,它会向您显示您的身体某些消息。

      更新下面的例外,然后它会显示您的消息。

      onException(RuntimeException.class)
                  //.useOriginalMessage()
                  .handled(true)
                  .log("after catching: ${body}");