Java 驼峰使用原始消息不起作用

Java 驼峰使用原始消息不起作用,java,apache-camel,Java,Apache Camel,生成输入主体的第一条路径 from("timer://bar?fixedRate=true&period=10000s") .process(new Processor() { @Override public void process(Exchange exchange) throws Exception { exchange.getIn().setB

生成输入主体的第一条路径

    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()
在这里不起作用?

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


可能根本原因与“direct”有关:被视为几乎是来自第一条路线的直接呼叫,因此意味着一个空的起始正文(来自计时器)。

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

  • 路线的起点计时器
  • 包括处理器的路由直接:dummydata
  • 异常路由运行时异常。类
  • 这很简单。我修改了你的问题

  • 开始时,您的正文消息为空
  • 而且,我看到您正在使用
    .useOriginalMessage()
    ,这意味着使用与本例中路径起始处出现的消息完全相同的消息,即NULL。当您评论或删除
    .useOriginalMessage()
    时,它会向您显示您的身体一些信息。

    按如下所示更新异常,然后它将显示您的消息

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