我已经使用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没有响应,那么设置属性已经为时已晚:
Service
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);
当然,这是一种可怕的处理方式,我将创建一个不错的工厂来生产这些绑定提供程序,并可以在所需的超时时间内注入这些绑定提供程序。