Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何避免客户端JAX-WSWeb服务的长时间等待?_Java_Web Services_Jax Ws - Fatal编程技术网

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

Java 如何避免客户端JAX-WSWeb服务的长时间等待?,java,web-services,jax-ws,Java,Web Services,Jax Ws,我需要实现一个web服务,它执行以下步骤: 从web服务A接收请求 向web服务B发送请求 将响应从wevservice B发送到web服务A 如果我的web服务在5秒后没有收到B的响应,它必须向A发送适当的答案,并停止等待B的答案 我已经使用wsimport工具为web服务B生成了客户端。所以据我所知,我应该为生成的客户端设置超时。我说得对吗? 我找到了以下解决方案: ((BindingProvider)portB).getRequestContext().put("javax.xml.ws.

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

  • 从web服务A接收请求
  • 向web服务B发送请求
  • 将响应从wevservice B发送到web服务A
  • 如果我的web服务在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。它对我不起作用

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

    try {
        Thread.sleep(15 * 1000);       
    } catch(InterruptedException ex) {
        Thread.currentThread().interrupt();
    }
    
    这个测试表明那些将属性放入BindingProvider的行不起作用。我的web服务只是等待所有这些15秒,而不是在1秒后停止。 我见过其他几个参数的名称变体(其中一些用于JBoss和Glassfish),但没有一个适合我。 我使用Tomcat8作为模拟服务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长时间等待响应的正确方法呢?

    您是否尝试添加到requestContext
    BindingProviderProperties.REQUEST\u TIMEOUT和BindingProviderProperties.CONNECT\u TIMEOUT
    ?现在我尝试了,它可以工作了。非常感谢。但这些常量仅用于Tomcat应用程序服务器,这是对的吗?如果web服务B将位于WebSphere或JBoss上,那么这些常量会起作用吗?