Apache Camel onException

Kik*_*kou 6 java apache esb onexception

我想从路线中捕捉所有异常.

我添加了这个OnExeption:

onException(Exception.class).process(new MyFunctionFailureHandler()).stop();
Run Code Online (Sandbox Code Playgroud)

然后,我创建了类MyFunctionFailureHandler.

public class MyFunctionFailureHandler  implements Processor {

@Override
public void process(Exchange exchange) throws Exception {
    Throwable caused;

    caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);

    exchange.getContext().createProducerTemplate().send("mock:myerror", exchange);
   }

}
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用,我不知道为什么.

如果有异常,程序必须停止.

我怎么知道为什么这段代码不起作用!!

谢谢.

Aal*_*iry 5

我在我的路线上使用了这个:

public class MyCamelRoute extends RouteBuilder {

   @Override
   public void configure() throws Exception {

        from("jms:start")
           .process(testExcpProcessor)

       // -- Handle Exceptions
       .onException(Exception.class)
         .process(errorProcessor)
         .handled(true)

       .to("jms:start");
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的错误处理器中

public class ErrorProcessor implements Processor {

  @Override
  public void process(Exchange exchange) throws Exception {


    Exception cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);

    if(cause != null){
        log.error("Error has occurred: ", cause);

        // Sending Error message to client
        exchange.getOut().setBody("Error");
    }else

        // Sending response message to client
        exchange.getOut().setBody("Good");
  }
}
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助

  • 从Camel 2.10开始,onException需要在路由顶部指定,并且onException子句需要以end()结束 (2认同)

Pan*_*tis 1

请记住,如果您在多个 RouteBuilder 类中有路由,则此路由中的 onExcpetion 将仅影响此 RouteBuilder 下的所有路由

查看这个答案

另外,如果异常发生在路由内并在该路由内处理,它不会传播到原始调用者路由,您需要使用 noErrorHandler() 即将from(direct:start).errorHandler(noErrorHandler())异常处理传播回调用者