我在使用 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 错误,但不会调用进程 (new ExceptionProcessor) 之后的任何内容。我承认我不是骆驼专家,所以我的设置方式可能有问题。
有趣的是,这曾经奏效。我们更新了 Camel 和 Spring 的版本以在 JDK 8+ 下工作,并且行为从 Camel 2.13 更改为 Camel 2.20
现在,如果我在异常处理器中注释掉 setFault(true) 行,它会正确调用路由中的以下行。这是有道理的,因为我实际上并没有告诉 Camel 创建一个 SOAP 错误——事实上,我正在生成一个自定义 SOAP 消息来发送回来,而不是 Camel 生成的 SOAP 错误。但是,就像我说的那样,以前这无需注释掉 setFault(true) 行就可以工作。
此外,我在异常处理器中还有其他异常,我检查这些异常确实会发回 SOAP 错误,因此(我相信)在交换中正确调用 setFault(true)。这些也无法继续路由,并且永远不会创建/调用 QueueBean。