如何在驼峰路由和spring引导中实现OneException和errorHandler?

如何在驼峰路由和spring引导中实现OneException和errorHandler?,spring,apache-camel,spring-camel,Spring,Apache Camel,Spring Camel,我想使用OneExceptionProcessor捕获路由生成器捕获的任何异常,并将它们保存在数据库中 我不知道是否必须使用OneException(Exception.class)或errorHandler()以及如何正确实现它们 我尝试了try-catch,但它没有捕获我的异常(我在processor1中抛出的空指针)。可能是我没有正确地执行它 这是我的routeBuilder: @component public class MyRoute extends RouteBuilder {

我想使用
OneExceptionProcessor
捕获路由生成器捕获的任何异常,并将它们保存在数据库中

我不知道是否必须使用OneException(Exception.class)或errorHandler()以及如何正确实现它们

我尝试了try-catch,但它没有捕获我的异常(我在processor1中抛出的空指针)。可能是我没有正确地执行它

这是我的routeBuilder:

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

这是
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()
。这是骆驼API中的一个小问题。更改它并查看它是否按预期工作

附加参考

请记住,当您使用
doTry()…doCatch()…end()
时,常规的Camel
OnException
处理程序将无法工作(不能将它们混合在一起)

更新:与OP共享的屏幕截图
这是
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()
。这是骆驼API中的一个小问题。更改它并查看它是否按预期工作

附加参考

请记住,当您使用
doTry()…doCatch()…end()
时,常规的Camel
OnException
处理程序将无法工作(不能将它们混合在一起)

更新:与OP共享的屏幕截图

你试过什么?文档已经发布,@RichardNeish我已经编辑了我的文章,因为我已经尝试了try-catch子句,但仍然没有捕获错误OK,在您的文章中的代码中,doTry()和doCatch仅在“.to(jmsDecoupageRouteOut)”行附近。如果您想在processor1中捕获异常,您应该在路由的这一步之前放置.doTry()。我这样做了,它也可以工作,但问题是如何在处理器中捕获消息错误?你知道吗?你试过什么?文档已经发布,@RichardNeish我已经编辑了我的文章,因为我已经尝试了try-catch子句,但仍然没有捕获错误OK,在您的文章中的代码中,doTry()和doCatch仅在“.to(jmsDecoupageRouteOut)”行附近。如果您想在processor1中捕获异常,您应该在路由的这一步之前放置.doTry()。我这样做了,它也可以工作,但问题是如何在处理器中捕获消息错误?你知道吗?我不需要在catch中使用to(“”),只需要一个处理器来捕获消息异常。但是我不知道怎么做,你知道吗?使用
.process(你的处理器)
而不是
.to()
。它不工作吗?是的,它可以工作,但是如果我想在处理器中捕获异常消息,我喜欢:
exception cause=exchange.getProperty(exchange.exception\u catch,exception.class)
但我得到了一个错误500,而不是我正在查找的nullPointerException。我想在我的
OneExceptionProcessor中捕获stackTrace,将其保存在数据库中,而不仅仅是记录它:)请稍候。启动测试环境;)我不需要在catch中使用to(“”),而只需要一个处理器来捕获消息异常。但我不知道如何执行此操作,知道吗?使用
.process(yourProcessor)
而不是
.to()
。它不工作吗?是的,它可以工作,但是如果我想在处理器中捕获异常消息,我喜欢:
exception cause=exchange.getProperty(exchange.exception\u catch,exception.class)
但我得到了一个错误500,而不是我正在查找的nullPointerException。我想在我的
OneExceptionProcessor中捕获stackTrace,将其保存在数据库中,而不仅仅是记录它:)请稍候。启动测试环境;)