Camel-使用split运算符处理异常

时间:2018-07-20 07:59:47

标签: exception apache-camel activemq

我通过“订单/商品”示例简化了用例。

订单中有一些商品。 每个项目都受控制=>可以从“ 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,...)时,我想停止该过程。我们不处理下一个项目,订单被重定向到错误队列。 我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以使用doTrydoCatch

  1. 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
    
  2. 您可以代替stop()在此处编写处理器并使用exchange.getContext().stop();

  3. 您也可以为onException添加另一个RunTimeException并停止路线。

  4. 另一种可能的方法是使用属性 ROUTE_STOP 。您可以在处理器异常时将此属性设置为true。 exchange.setProperty(Exchange.ROUTE_STOP, Boolean.TRUE);