【问题标题】:Apache CXF web service response re-routing on web service client gone detectionApache CXF Web 服务响应重新路由 Web 服务客户端消失检测
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 嗨@Matthew,感谢您的回复。我当时认为解决方案类似于死信错误处理程序等。但是,在测试期间,我发现如果我在调用过程中断开客户端,Web 服务本身不会抛出任何将响应写回 Exchange 的输出通道时出现异常或类似情况。就好像它不在乎客户是否还在。如果客户端在路由过程的响应发送阶段不再存在,服务不应该至少抛出异常吗?
    • 会抛出肥皂故障吗? Camel 不会将 Soap 故障视为异常,因为它是有效响应(尽管是错误响应)。在骆驼上下文中将 handleFault 设置为“true”,以将肥皂错误转换为异常
    • handleFault 似乎没有任何区别(除非我设置错误?)。我的网络服务路由大致设置如下:from("cxf:/AService?dataFormat=PAYLOAD").handleFault()...to(ExchangePattern.InOut, mqUri)。我也有一个后处理器调用,我在其中修改响应消息。修改后,我通过调用 exchange.getOut().setBody(response) 来编写响应。我预计在最后一次通话期间会发生异常或故障?
    • 您需要在骆驼上下文中设置它:camelContext.setHandleFault(true);
    • 我的路由在 RouteBuilder 类中配置,并且在 configure() 方法中我现在调用 getContext().setHandleFault(true);但是在发送响应之前断开客户端连接似乎仍然没有发生故障或异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 2012-04-13
    • 2015-05-26
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多