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())
распространять обработку исключений обратно к вызывающей стороне