我在Camel遇到问题,当调用一个在交换机上设置故障的处理器时,路由会在完成路由之前中止。我有一个像这样配置的异常处理程序:
onException(Throwable.class) {
process(new Processor() {
public void process(Exchange exchange) {
// do some logging of exception details
})
.handled(true)
.process(new ExceptionProcessor())
.bean(new QueueBean(), "writeRequest")
.bean(new QueueBean(), "writeResponse)
.end();
});
}
在ExceptionProcessor类中,它类似于:
public void process(Exchange exchange) {
Exception ex = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
if(ex instanceof MyException) {
// do some stuff
exchange.setProperty("errorTransaction", errorMsg);
exchange.getIn().setBody(response);
exchange.getIn().setFault(true);
} else if(ex instanceof SomeOtherException {
// do some other stuff
exchange.getIn().setFault(true);
}
}
问题在于,如果捕获到异常,则不会调用QueueBean行。创建并发送SOAP错误,但是不调用流程(新ExceptionProcessor)之后的任何东西。我承认我不是骆驼专家,所以我可能会在设置方式上做错什么。
有趣的是,此用于。我们更新了Camel和Spring的版本以在JDK 8+下运行,并且行为从Camel 2.13更改为Camel 2.20
现在,如果我注释掉异常处理器中的setFault(true)行,它将在路由中正确调用以下行。之所以这样说是有道理的,因为我实际上并没有告诉Camel创建SOAP错误-实际上,我正在生成自定义的SOAP消息以发回,而不是Camel生成的SOAP错误。但是,就像我说的那样,以前这种方法无需注释掉setFault(true)行即可。
此外,我在异常处理器中还有其他异常需要检查,以便发回SOAP错误,因此(我相信)可以在交易所正确调用setFault(true)。这些也无法继续路由,并且永远不会创建/调用QueueBean。