设置jax-ws客户端超时时间

12

我在设置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时,客户端尝试连接,如果服务器没有响应,它就会永远挂起。

更新:如果这有任何区别,这段代码是从小程序的init()方法中调用的。

5个回答

7

使用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); 

2
实际上,这就是第一个答案中所说的(以及问题本身中所说的)。另外,如果有人不害怕与Sun内部耦合,也许导入com.sun.xml.ws.developer.JAXWSProperties并使用JAXWSProperties.CONNECT_TIMEOUTJAXWSProperties.REQUEST_TIMEOUT是有意义的。 - dma_k
我该如何获取wsPort实例? - mvmn

1
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);

这对我很有用。


1
如果您正在使用Sun JRE,您可以设置以下系统属性作为默认的网络连接和读取超时时间(以毫秒为单位)。我尚未在JAX-WS客户端中尝试过这些属性,但它们应该也能在那里工作:
sun.net.client.defaultConnectTimeout
sun.net.client.defaultReadTimeout

补充一下:我错过了你问题的最后一部分,你说你是在一个小程序中进行这个操作。如果该小程序正在使用默认权限运行,那么你可能无法设置系统属性。

小应用程序已签名。这很难复制。因为当服务器挂起时(而不是宕机时),客户端会挂起。 - Lukasz
1
你可以使用以下服务器代码模拟一个挂起的TCP服务器:ServerSocket serverSocket = new ServerSocket(PORT); while (true) { serverSocket.accept(); }只需接受连接,但在“虚拟服务器”端不要读取或写入任何内容。 - auramo

0

这里是一个例子

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");
}

0

你可以将你的 VoipDB 对象转换为 BindingProvider。因此,在你提供的链接示例中,只需将 proxy 替换为 db,然后你就可以开始了。


1
实际上,这并不起作用,因为客户端在调用 getPort 的行上挂起了。 - Lukasz
好的,这就是提供的方法所能做的一切。jax-ws会下载服务的WSDL以创建代理。很可能这就是导致问题的原因。我现在唯一能想到的事情就是下载一个本地副本的WSDL并使用它,但这当然并不是很优雅的解决方案... - musiKk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接