我有一个Camel路由,它将返回自定义MyPojo.class或自定义RouteRequestException.class。这是路线:
.from("direct:myPojoTest")
// retrieve MyPojo
.to(myPojoQueue)
.choice()
.when(header(Exchange.EXCEPTION_CAUGHT))
.unmarshal().json(JsonLibrary.Jackson, RouteRequestException.class)
.endChoice()
.otherwise()
.unmarshal().json(JsonLibrary.Jackson, MyPojo.class)
.end()
//.to("log:mypojo?level=DEBUG&showAll=true&multiline=true")
myPojoQueue返回的是一个JSON字符串,表示MyPojo实例或RouteRequestException。如果发回异常,则会在消息上设置Exchange.EXCEPTION_CAUGHT标头。
问题是如果我的路由以最后一个.end()(绑定到.choice())结束,最终返回调用者的是从myPojoQueue返回的JSON字符串,基本上使unmarshal()语句无效。但是,如果我取消注释.to(“log ...”)语句,则所需的unmarshal()会生效(在任何一种情况下)。
我见过的每个unmarshal()示例都会立即显示.to()。基于那个(以及我看到的问题)我猜测unmarshal()实际上并没有执行,直到调用另一个端点。有谁知道这是真的吗?我是否需要在()中添加“no-op”以使其工作(hacky)?
在这种情况下,我是否应该尝试以不同的方式解散POJO?
我还应该提到我正在使用Camel 2.15.2。