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

我已经使用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();

谁能指出我正确的方向?

回答:

我知道这很古老,可以在其他地方回答,但希望这可以解决这个问题。我不确定为什么要动态下载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);

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

以上是 如何设置JAX-WS Web服务客户端的超时时间? 的全部内容, 来源链接: utcz.com/qa/428747.html

回到顶部