忽略Web服务单向操作的HTTP响应

时间:2016-04-20 16:03:05

标签: java web-services jax-ws

我正在开发一个jax-ws webservice,它使用单向操作将消息异步推送到订阅的使用者。

不幸的是,服务器等待HTTP202响应确认,它会阻塞线程几分之一秒。这会影响系统的性能,我正在寻找解决方案。

有没有办法执行Web服务单向调用并忽略HTTP响应状态?

1 个答案:

答案 0 :(得分:0)

好的,所以在花了很多时间之后,我找到了两个解决方案:

1)使用Apache HTTPComponents,它为AsyncHTTPClient提供了很好的API,允许我们从头开始构建HTTP响应。

2)更多面向Web服务的解决方案基于Apache CXF平台(包括HTTPClient实现) - 首先我们需要设置全局总线属性:

Bus bus = BusFactory.getDefaultBus();
bus.setProperty(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);

然后,我们使用自定义拦截器将消息交换属性设置为异步:

final class SkipWaitInterceptor extends AbstractSoapInterceptor {

    SkipWaitInterceptor() {
        super(Phase.SETUP);
    }

    @Override
    public void handleMessage(final SoapMessage message) throws Fault {
        message.getExchange().setSynchronous(false);
    }

}

最后,我们在异步端点

上注册拦截器
org.apache.cxf.endpoint.Client client =
                org.apache.cxf.frontend.ClientProxy.getClient(this.notificationConsumer);
org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();
cxfEndpoint.getOutInterceptors().add(new SkipWaitInterceptor());

总而言之,单向操作响应不再阻止通信。