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

Exception 使用split运算符处理Camel异常,exception,apache-camel,activemq,Exception,Apache Camel,Activemq,我用订单/项目示例简化了我的用例 订单上有一些项目。 每个项目都是受控的=>可以从“controlItem”引发AvailabilityException。 抛出异常后,项目被标记为Ok,并处理下一个项目 onException(AvailabilityException.class) .onExceptionOccurred(ItemProcessor) .handled(true) .bean(service, "mar

我用订单/项目示例简化了我的用例

订单上有一些项目。 每个项目都是受控的=>可以从“controlItem”引发AvailabilityException。 抛出异常后,项目被标记为Ok,并处理下一个项目

       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,…)时,我希望停止进程。我们不处理下一个项目,订单被重定向到错误队列。
我该怎么做呢?

您可以使用
doTry
doCatch

  • 您可以在那里编写处理器并使用
    exchange.getContext().stop(),而不是
    stop()

  • 您还可以为
    RunTimeException
    s添加另一个
    oneexception
    ,并停止路由

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

  • 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