Java 如何避免客户端JAX-WSWeb服务的长时间等待?
我需要实现一个web服务,它执行以下步骤: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.
((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上,那么这些常量会起作用吗?