如何避免客户端JAX-WS Web服务的长时间等待?

时间:2015-04-30 11:50:13

标签: java web-services jax-ws

我需要实现一个Web服务,它执行以下步骤:

  1. 接收来自网络服务A的请求
  2. 向网络服务B发送请求
  3. 将wevservice B的响应发送到Web服务A
  4. 如果我的网络服务在5秒后没有收到来自B的回复,则必须向A发送适当的答案并停止等待来自B的回答。

    我使用wsimport工具为Web服务B生成了客户端。据我所知,我应该为生成的客户端设置超时。我对吗? 我找到了以下解决方案:

    ((BindingProvider)portB).getRequestContext().put("javax.xml.ws.client.connectionTimeout", "1000");
    ((BindingProvider)portB).getRequestContext().put("javax.xml.ws.client.receiveTimeout", "1000");
    

    但我不喜欢这个解决方案,原因有两个:

    1。它对我不起作用

    我编写了简单的服务B模拟器,它接收来自我的Web服务的响应并发送模拟回复。为了测试超时,我将此代码添加到模拟服务B:

    try {
        Thread.sleep(15 * 1000);       
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    

    此测试显示那些具有BindingProvider属性的行不起作用。我的网络服务只需等待15秒,而不是在1秒后停止。 我已经看到这些参数的名称很少有其他变体(其中一些用于JBoss和Glassfish),但它们都不适用于我。 我使用Tomcat 8作为模拟服务B的应用服务器。

    2。它并非适用于所有应用程序服务器。

    据我所知,每个应用服务器都有唯一的超时参数名称。如果Web服务B站在JBoss上,那么我应该使用

    ((BindingProvider)portB).getRequestContext().put(TIMEOUT_PARAMS_NAME_FOR_JBOSS, "2000");
    

    但是如果Web服务B站在WebSphere上而不是我使用

    ((BindingProvider)portB).getRequestContext().put(TIMEOUT_PARAMS_NAME_FOR_WEBSPHERE, "2000");
    

    等等。 但是,如果我不知道Web服务B使用哪个应用程序服务器呢?我对这一刻有点困惑。也许我只是误解了什么?

    那么在我的情况下,避免长时间等待Web服务B响应的正确方法是什么?

0 个答案:

没有答案