使用Apache Camel for EIP,我有一个Apache CXF Web服务端点,在调用时,会将请求放入MQ队列。异步处理该MQ队列中的请求,然后生成响应并将其放入响应MQ队列中。 Apache CXF Web服务从响应MQ队列收集请求的响应,然后将其写入Exchange的通道以供调用客户端接收。
是否可以配置我的Web服务,以便在尝试将异步响应发送回客户端时,它可以检测客户端是否仍然连接?当发生此检测时,将响应路由到另一个Camel路由?
用例场景将是客户端调用Web服务但在5秒内未从Web服务接收响应后断开连接的情况。之后,当Web服务处理请求并且无法将响应发送到不再连接的客户端时,它会将响应重新路由到例如smtp路由。
*更新*
阅读了各种在线文档和论坛帖子后,我的服务配置如下:
<camelContext xmlns="http://camel.apache.org/schema/spring" handleFault="true">
<routeBuilder ref="aServiceRoute" />
</camelContext>
在我的AServiceRoute路线中,我按如下方式配置了我的路线:
@Override
public void configure() throws Exception {
onException(Exception.class).process(new Processor() {
public void process(Exchange exchange) throws Exception {
log.debug("caught Exception A!!!");
}});
from(cxfUri)
.onException(Exception.class).process(new Processor() {
public void process(Exchange exchange) throws Exception {
log.debug("caught Exception B!!!");
}}).end()
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
// do something..
}
})
.to(ExchangePattern.InOut, mqUri);
对于我的第一次测试,我在// do something..
注释的过程中强制执行异常抛出。当我运行此测试时,我会看到日志"caught Exception A!!!"
,这很棒。
对于我的第二次测试,我基本上运行了我在本文中描述的测试场景。当我运行此测试时,我看到记录了一个cxf堆栈跟踪:
=09-05-14 12:25:32 [WARN ] org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {http://camel.apache.org/cxf/jaxws/provider}DefaultPayloadProviderSEIService#{http://cxf.component.camel.apache.org/}invoke has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
但是没有调用我的路由的onException()方法。
我错过了什么?我是否需要将onException()方法放在服务路径的其他位置?
先谢谢,PM。