Apache Camel onException

Я хочу поймать все исключения из маршрутов.

Я добавляю это OnExeption:

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

}

К сожалению, это не работает, и я не знаю почему.

если есть исключение, программа должна остановиться.

Как я могу узнать, почему этот код не работает!!

Благодарю.

2 ответа

Я использовал это на своем маршруте:

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

и в моем errorProcessor

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

Я надеюсь, что это помогает

Имейте в виду, что если у вас есть маршруты в нескольких классах RouteBuilder, наличие onExcpetion в этом маршруте повлияет на все маршруты только в этом RouteBuilder

просмотрите этот ответ

Кроме того, если исключение возникает в маршруте и обрабатывается внутри этого маршрута, оно не будет распространено на исходный маршрут вызывающего абонента, который необходимо использовать noErrorHandler(), т.е. from(direct:start).errorHandler(noErrorHandler()) распространять обработку исключений обратно к вызывающей стороне

Другие вопросы по тегам