一尘不染

如何设置JAX-WS Web服务客户端的超时时间?

java

我已经使用JAXWS-RI
2.1为基于WSDL的Web服务创建了一个接口。我可以与Web服务进行交互,没有问题,但是无法指定将请求发送到Web服务的超时时间。如果由于某种原因它没有响应,则客户似乎永远旋转它的轮子。

到处搜寻表明我可能应该尝试执行以下操作:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);

我还发现,根据您拥有的JAXWS-RI版本,您可能需要设置以下属性:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);

我的问题是,无论以上哪一项是正确的,我都不知道 在哪里
可以做到这一点。我所拥有的只是一个Service子类,该子类实现了自动生成的Web服务接口,并且当实例化时,如果WSDL没有响应,那么设置属性已经为时已晚:

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();

谁能指出我正确的方向?


阅读 863

收藏
2020-09-08

共1个答案

一尘不染

我知道这很古老,可以在其他地方回答,但希望这可以解决这个问题。我不确定为什么要动态下载WSDL,但不确定系统属性:

sun.net.client.defaultConnectTimeout (default: -1 (forever))
sun.net.client.defaultReadTimeout (default: -1 (forever))

应该适用于所有读取,并使用JAX-WS使用的HttpURLConnection进行连接。如果从远程位置获取WSDL,这应该可以解决您的问题-
但本地磁盘上的文件可能更好!

接下来,如果要为特定服务设置超时,则在创建代理后,需要将其强制转换为BindingProvider(您已经知道),获取请求上下文并设置属性。在线JAX-
WS文档是错误的,这些是正确的属性名称(嗯,它们对我有用)。

MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP();
Map<String, Object> requestContext = ((BindingProvider)myInterface).getRequestContext();
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis
myInterface.callMyRemoteMethodWith(myParameter);

当然,这是一种可怕的处理方式,我将创建一个不错的工厂来生产这些绑定提供程序,并可以在所需的超时时间内注入这些绑定提供程序。

2020-09-08