我们的应用程序需要向SOAP服务发送一些请求。我们使用wsimport命令为客户端生成类。但是有时在服务中断或某些网络问题时,我们的请求将一直挂起直到超时,这太长了。我们想控制超时值,因此我们尝试使用服务器方法。
对于调用服务方法,在阅读其他文章后,我们设置如下:
((BindingProvider) port).getRequestContext().put("sun.net.client.defaultReadTimeout", 3000);
((BindingProvider) port).getRequestContext().put("sun.net.client.defaultConnectTimeout", 10000);
但是在此之前,我们必须调用get port来读取wsdl文件。我们尝试创建如下网址:
url = new URL(null, "http://theirsite/WS?WSDL", new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL url) throws IOException {
logger.info("URLStreamHandler got call!");
URL clone_url = new URL(url.toString());
HttpURLConnection clone_connection
= (HttpURLConnection) clone_url.openConnection();
clone_connection.setConnectTimeout(5000);
clone_connection.setReadTimeout(3000);
return (clone_connection);
}
});
然后,在创建Service对象时,将此URL用作参数。但是我们的URLStreamHandler从未接到过电话。
我们甚至尝试像这样设置系统属性:
System.setProperty("sun.net.client.defaultReadTimeout", "" + 3000);
System.setProperty("sun.net.client.defaultConnectTimeout", "" + 5000);
但是到目前为止,对我们来说没有任何作用。
那么any1可以帮助我解决这个问题吗?还是有更好的方法?需要说明的是,我们不想从本地读取wsdl文件。
最佳答案
也许您使用的属性不正确。
试试这些:
((javax.xml.ws.BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout",
Integer.valueOf(timeout));
((javax.xml.ws.BindingProvider) port).getRequestContext().put("com.sun.xml.internal.ws.request.timeout",
Integer.valueOf(timeout));
另外,请注意,
com.sun.xml.ws.request.timeout
和com.sun.xml.internal.ws.request.timeout
之间存在差异。使用JDK JAX-WS实现时,应使用internal。