我通过“订单/商品”示例简化了用例。
订单中有一些商品。 每个项目都受控制=>可以从“ controlItem”抛出AvailabilityException。 引发异常后,将项目标记为“确定”并处理下一个项目。
onException(AvailabilityException.class)
.onExceptionOccurred(ItemProcessor)
.handled(true)
.bean(service, "markAsOk");
from(startQueue)
.split(simple("${body.items}"))
.to(direct:controlItem")
.end()
.to(successQueue);
from("direct:controlItem")
.bean(service, "controlItem");
现在我还有另一种情况:
当引发意外异常(NullPointerException,...)时,我想停止该过程。我们不处理下一个项目,订单被重定向到错误队列。 我该怎么办?
答案 0 :(得分:1)
您可以使用doTry
和doCatch
from(startQueue)
.doTry()
.split(simple("${body.items}"))
.to(direct:controlItem")
.end()
.to(successQueue);
.doCatch(AvailabilityException.class)
....
....
.handled(true)
.doCatch(RunTimeException.class)
....
....
.handled(false)
.stop() // stop the execution
.doFinally() //optional
您可以代替stop()
在此处编写处理器并使用exchange.getContext().stop();
您也可以为onException
添加另一个RunTimeException
并停止路线。
另一种可能的方法是使用属性 ROUTE_STOP 。您可以在处理器异常时将此属性设置为true。
exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);