Web服务客户端上的Apache CXF Web服务响应重新路由检测失败

时间:2014-05-07 14:00:49

标签: web-services cxf apache-camel soapui

使用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。

1 个答案:

答案 0 :(得分:0)

死信频道将提供您所需的行为:https://camel.apache.org/dead-letter-channel.html