我正在使用 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() )