5

我正在使用 Metro 2.0 和 J2SE5。我编写的应用程序在编译时不知道外部 WebService,它在运行时根据业务逻辑 XML 文件找到它们,因此我执行 WSDL 请求。

我写的示例代码如下:

String wsdlServiceName = ...; String wsdlURL = ...; Document payload = ...;

final String nsURI = ...;
final QName serviceName = new QName(nsURI, wsdlServiceName + "Service");
final QName servicePort = new QName(nsURI, wsdlServiceName + "Port");

// Create service and the dispatcher for the SOAP message
Service service = Service.create(new URL(wsdlURL), serviceName);
dispatch = service.createDispatch(servicePort, SOAPMessage.class, Service.Mode.MESSAGE);

// Set timeouts
dispatch.getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 3000);
dispatch.getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 3000);

// Create the outgoing SOAP request
SOAPBinding soapBinding = (SOAPBinding) dispatch.getBinding();
request = soapBinding.getMessageFactory().createMessage();

SOAPBody requestBody = request.getSOAPBody();
requestBody.addDocument(payload);

// Invoke web service operation 
SOAPMessage response = dispatch.invoke(request);

调用 Web 服务时超时正常工作( dispatcher.invoke(request) )

但是,在设置超时之前请求 WSDL,如果 Web 服务没有响应,则连接超时之前需要 90 秒。

是否可以在请求 WSDL 之前设置超时?您需要一个调度程序来设置超时,但这是在创建请求 WSDL 的服务之后完成的?!(即 Service.create() )

4

2 回答 2

3

尝试设置系统属性

sun.net.client.defaultConnectTimeout 

但从Networking Properties中说,它可能在未来的版本中不受支持

但是我建议缓存 WSDL 而不要远程访问它。
尤其是当您使用的 WSDL 预计不会经常更改时,这会带来更好的性能。

于 2010-12-08T13:52:19.710 回答
2

我们刚刚遇到了同样的问题,并尝试了上面提到的所有设置 - 同样,无济于事。

我们的解决方案是首先使用 URL.openConnection() 将 WSDL 下载到一个临时文件(使用 URLConnection.setConnectionTimeout() 和 URLConnection.setReadTimeout() 设置连接超时)。然后,我们使用 File.toURI().toURL() 为该文件生成一个 url,我们将其传递给接受 URL 的服务构造函数。

这种方法允许您动态获取当前的 WSDL,同时显式控制超时。然后,我们为后续调用服务设置超时,如您在原始帖子中所示。

于 2011-02-11T22:30:55.173 回答