Apache Camel onException

8

我希望从路由中捕获所有的异常。

我添加了以下的 OnException 代码:

onException(Exception.class).process(new MyFunctionFailureHandler()).stop();

然后,我创建了名为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);
   }

}

很遗憾,它不起作用,我不知道原因。

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

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

谢谢。


1
我必须问一下...为什么不使用onException(Exception.class).to("mock:myerror")呢?为什么要使用一个处理器来转发到另一个端点? - kaqqao
2个回答

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");
   }
}

并且在我的错误处理器

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");
  }
}

我希望这能有所帮助。


2
从Camel 2.10开始,onException需要在路由的顶部指定,并且onException子句需要以end()结束。 - Monish Sen

1
请记住,如果您有多个RouteBuilder类中的路由,那么在该路由中有一个onExcpetion将仅影响此RouteBuilder下的所有路由。
请查看此answer
此外,如果路由中发生异常并在此路由内处理,则不会传递到原始调用方路由,您需要使用noErrorHandler()即from(direct:start).errorHandler(noErrorHandler())将异常处理传播回调用方。

如果在内部路由中未处理,则 不会 将其传播到调用者,除非您使用所描述的解决方法。但是我从来没有让这个解决方法起作用过.... - kaqqao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接