生成输入体的第一个路径。
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()
无效?
答案 0 :(得分:3)
问题似乎是使用“直接:”。如果您将其更改为“direct:vm”,您应该看到所需的结果。
也许潜在的原因与“直接:”被处理的关系几乎就像是从第一条路线直接调用,因此意味着一个空的起始体(来自计时器)。
答案 1 :(得分:2)
因为,我看到你有3条路线
很简单。我修改了你的问题。
而且,我发现你正在使用.useOriginalMessage()
,这意味着在这种情况下使用路径起点中存在的完全相同的消息 NULL 。当您评论或删除.useOriginalMessage()
时,它会向您显示您的身体某些消息。
更新下面的例外,然后它会显示您的消息。
onException(RuntimeException.class)
//.useOriginalMessage()
.handled(true)
.log("after catching: ${body}");