Web services Apache CXF web服务响应在web服务客户端上重新路由

Web services Apache CXF web服务响应在web服务客户端上重新路由,web-services,cxf,apache-camel,soapui,Web Services,Cxf,Apache Camel,Soapui,使用ApacheCammel for EIP,我有一个ApacheCxfWeb服务端点,当调用它时,它会将请求放入MQ队列。该MQ队列中的请求以异步方式处理,然后生成响应并将其放入响应MQ队列中。Apache CXF Web服务从响应MQ队列收集请求的响应,然后将该响应写入Exchange的输出通道,以便调用客户端接收 是否可以配置我的web服务,以便它可以在尝试将异步响应发送回客户端时检测客户端是否仍处于连接状态?当这种检测发生时,将响应路由到另一个驼峰路由 例如,一个用例场景是,客户机对we

使用ApacheCammel for EIP,我有一个ApacheCxfWeb服务端点,当调用它时,它会将请求放入MQ队列。该MQ队列中的请求以异步方式处理,然后生成响应并将其放入响应MQ队列中。Apache CXF Web服务从响应MQ队列收集请求的响应,然后将该响应写入Exchange的输出通道,以便调用客户端接收

是否可以配置我的web服务,以便它可以在尝试将异步响应发送回客户端时检测客户端是否仍处于连接状态?当这种检测发生时,将响应路由到另一个驼峰路由

例如,一个用例场景是,客户机对web服务进行调用,但在未收到web服务响应的5秒钟后断开连接。稍后,当web服务处理请求并且无法将响应发送到不再连接的客户机时,它会将响应重新路由到例如smtp路由

*更新*

阅读了各种在线文档和论坛帖子后,我的服务配置如下:

<camelContext xmlns="http://camel.apache.org/schema/spring" handleFault="true">
    <routeBuilder ref="aServiceRoute" />
</camelContext>
@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..
注释为。当我运行这个测试时,我看到日志“捕获异常A!!!”,这很好

对于第二个测试,我基本上运行了本文中描述的测试场景。当我运行此测试时,我看到记录了一个cxf stacktrace:

=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)
但是没有调用我的route的onException()方法

我错过了什么?我是否需要将OneException()方法放在服务路由的其他位置


提前感谢,PM。

死信频道将提供您需要的行为:

嗨@Matthew,谢谢您的回复。我认为,解决方案将是一个沿着死信错误处理程序等的东西。然而,在测试过程中,我发现如果我在调用中间断开客户机,Web服务本身就不会抛出任何异常或类似的东西,当它将响应写回Exchange的OUT通道时。就好像它不在乎客户是否还在那里。如果客户端在路由过程的响应发送阶段不再存在,服务不应该抛出异常吗?是否抛出soap错误?Camel不会将Soap错误视为异常,因为它是一个有效的响应(尽管是一个错误响应)。在camel上下文中将handleFault设置为“true”,以将soap错误转换为异常handleFault似乎没有任何区别(除非我将其设置为错误?)。我的web服务路由大致设置如下:from(“cxf:/AService?dataFormat=PAYLOAD”).handleFault()…to(ExchangePattern.InOut,mqUri)。我也有一个后处理器调用,其中我修改了响应消息。修改后,我通过调用exchange.getOut().setBody(response)编写响应。我期望在最后一次调用期间出现异常或错误?您需要在camelContext上设置它:
camelContext.setHandleFault(true)我的路由是在RouteBuilder类中配置的,在configure()方法中,我现在调用getContext().setHandleFault(true);但在发送响应之前,当我断开客户端连接时,仍然没有出现任何故障或异常。