【发布时间】:2014-05-07 14:00:48
【问题描述】:
使用 Apache Camel 进行 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。
【问题讨论】:
标签: web-services cxf apache-camel soapui