如何在骆驼路线和 spring 引导中实现 OnException 和 errorHandler?
How to implement OnException and errorHandler in a camel route and spring boot?
我想使用 onExceptionProcessor
来捕获我的路由构建器捕获的任何异常并将它们保存在数据库中。
我不知道我是否必须使用 onException(Exception.class) 或 errorHandler() 以及如何正确实现它们!
我尝试了 try-catch,但它没有捕捉到我的异常(我在处理器 1 中抛出的空指针)。可能是我没有正确实施它?
这是我的 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()
。这是 Camel API 中的一个小问题。更改它,看看它是否按预期工作。
其他参考资料
请记住,当您使用 doTry()...doCatch()...end()
时,常规 Camel OnException
处理程序将不起作用(您不能将它们混合在一起)。
更新:与 OP 共享的屏幕截图
我想使用 onExceptionProcessor
来捕获我的路由构建器捕获的任何异常并将它们保存在数据库中。
我不知道我是否必须使用 onException(Exception.class) 或 errorHandler() 以及如何正确实现它们!
我尝试了 try-catch,但它没有捕捉到我的异常(我在处理器 1 中抛出的空指针)。可能是我没有正确实施它?
这是我的 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()
。这是 Camel API 中的一个小问题。更改它,看看它是否按预期工作。
其他参考资料
请记住,当您使用 doTry()...doCatch()...end()
时,常规 Camel OnException
处理程序将不起作用(您不能将它们混合在一起)。
更新:与 OP 共享的屏幕截图