Как реализовать OnException и errorHandler в верблюде и весенней загрузке? - PullRequest
0 голосов
/ 17 июня 2019

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

Я не знаю, должен ли я использовать onException (Exception.class) или errorHandler () и как их правильно реализовать!

Я попробовал try-catch, но он не улавливает мое исключение (нулевой указатель, который я выбрасываю в процессор1). Может быть, я не правильно его реализую?

Вот мой маршрутBuilder:

@component
public class MyRoute extends RouteBuilder {

  @Autowired
  private Processor processor1;  

  @Autowired
  private Processor procssor2;  

  @Autowired
  private Processor processor3;

  @Autowired
  private Processor onExceptionProcessor; // it a processor where i try to save the stacktrace of exception in the database

  @Override
  public void configure() throws Exception {
    from(jmsDecoupageRouteIn)
        .id("route_id_processing").messageHistory().transacted()
        .log(LoggingLevel.DEBUG, log, "It's for just for log").pipeline()
        .process(processor1)
        .id(processor1.getClass().getSimpleName().toLowerCase())
        .process(procssor2)
        .id(procssor2.getClass().getSimpleName().toLowerCase())
        .process(processor3)
        .id(processor3.getClass().getSimpleName().toLowerCase())
        .doTry()
        .to(jmsDecoupageRouteOut)
        .doCatch(Exception.class)
        .log(LoggingLevel.ERROR, "EXCEPTION: ${exception.stacktrace}")
        .process(onExceptionProcessor)
        .id(onExceptionProcessor.getClass().getSimpleName().toLowerCase())
        .endDoTry();
  }
}

1 Ответ

2 голосов
/ 17 июня 2019

Это общая структура конструкции doTry()...doCatch()...end().

 from("direct:start")
                    .doTry()
                        .process(new ProcessorFail())
                        .to("mock:result")
                    .doCatch(IOException.class, IllegalStateException.class)
                        .to("mock:catch")
                    .doFinally()
                        .to("mock:finally")
                    .end();

В вашем случае вы используете .endDoTry() вместо .end(). Это крошечная ошибка в Camel API. Измените его и посмотрите, работает ли он должным образом.

Дополнительная справка

Имейте в виду, что при использовании doTry()...doCatch()...end() обычные обработчики Camel OnException не будут работать (вы не можете смешивать их вместе).

Обновление: снимок экрана, предоставленный OP Exception handling processor definition

...