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

}

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

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

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

Спасибо.


person Kikou    schedule 07.01.2013    source источник
comment
Я должен спросить... Почему не onException(Exception.class).to(mock:myerror)? Зачем использовать процессор только для переадресации на другую конечную точку?   -  person kaqqao    schedule 02.04.2014


Ответы (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");
  }
}

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

person Aalkhodiry    schedule 29.05.2014
comment
начиная с Camel 2.10, onException необходимо указывать в начале маршрута, а предложение onException должно заканчиваться end() - person Monish Sen; 19.04.2017

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

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

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

person Panayiotis    schedule 22.01.2013
comment
Если он не будет передан вызывающему, если он не был обработан внутренним маршрутом, если вы не используете описанный вами обходной путь. Но у меня никогда не работало обходное решение.... - person kaqqao; 02.04.2014