设置jax-ws客户端超时
我在设置jax-ws超时时遇到了麻烦。 我的代码是:
@WebServiceClient(name = "VoipDBJDBCService", targetNamespace = "http://db.server.voipmeter.jextreme.eu/", wsdlLocation = "http://trace0.nyc.blinkmind.com:8080/voipdb?wsdl") public class VoipDBJDBCService extends Service { public VoipDBJDBCService(URL wsdlLocation) { super(wsdlLocation, new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCService")); } @WebEndpoint(name = "VoipDBJDBCPort") public VoipDB getVoipDBJDBCPort() { return super.getPort(new QName("http://db.server.voipmeter.jextreme.eu/", "VoipDBJDBCPort"), VoipDB.class); } }
用法:
VoipDB db = new VoipDBJDBCService(new URL(url)).getVoipDBJDBCPort();
我如何挂断超时? 我在这里找到了“解决方案”: https : //jax-ws.dev.java.net/guide/HTTP_Timeouts.html但我不知道我将把它挂钩。如何获取代理? 当我调用getPort客户端尝试连接,然后如果服务器没有响应则永远挂起。
更新:此代码是从applet init()方法中调用的,如果这有任何区别。
使用Metro / Glassfish ……
//1 minute for connection ((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.connect.timeout", 1 * 60 * 1000); //3 minutos for request ((BindingProvider) wsPort).getRequestContext().put("com.sun.xml.ws.request.timeout", 3 * 60 * 1000);
ProxyWs proxy = (ProxyWs) factory.create(); Client client = ClientProxy.getClient(proxy); HTTPConduit http = (HTTPConduit) client.getConduit(); HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy(); httpClientPolicy.setConnectionTimeout(0); httpClientPolicy.setReceiveTimeout(0); http.setClient(httpClientPolicy);
这对我有用。
如果您使用的是Sun JRE,则可以为默认网络连接和读取超时设置以下系统属性(以毫秒为单位)。 我没有尝试使用JAX-WS客户端,但它们也应该在那里工作:
sun.net.client.defaultConnectTimeout sun.net.client.defaultReadTimeout
另外:我错过了问题的最后一部分,你说你在小程序中这样做了。 如果applet以默认权限运行,则可能不允许您设置系统属性。
您可以将VoipDB
对象转换为BindingProvider
。 因此,在链接的示例中,您只需用db
替换proxy
,就可以了。
这是一个例子
public void testConfigureTimeout() throws Exception { //Set timeout until a connection is established ((BindingProvider)port).getRequestContext() .put("javax.xml.ws.client.connectionTimeout", "6000"); //Set timeout until the response is received ((BindingProvider) port).getRequestContext() .put("javax.xml.ws.client.receiveTimeout", "1000"); port.echo("testTimeout"); }