如何设置JAX-WS Web服务客户端的超时?

nin*_*ded 88 java soap web-services timeout jax-ws

我已经使用JAXWS-RI 2.1基于WSDL为我的Web服务创建了一个接口.我可以与Web服务进行交互没有问题,但是无法指定向Web服务发送请求的超时.如果由于某种原因它没有响应客户端似乎永远旋转它的轮子.

狩猎已经显示我应该尝试做这样的事情:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.ws.connect.timeout", 10000);
Run Code Online (Sandbox Code Playgroud)

我还发现,根据您拥有的JAXWS-RI版本,您可能需要设置这些属性:

((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.request.timeout", 10000);
((BindingProvider)myInterface).getRequestContext().put("com.sun.xml.internal.ws.connect.timeout", 10000);
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,无论上述哪一项是正确的,我都不知道我能在哪里做到这一点.我所拥有的只是一个Service子类,它实现了自动生成的webservice接口,并且实现了这一点,如果WSDL没有响应,那么设置属性已经太晚了:

MyWebServiceSoap soap;
MyWebService service = new MyWebService("http://www.google.com");
soap = service.getMyWebServiceSoap();
soap.sendRequestToMyWebService();
Run Code Online (Sandbox Code Playgroud)

任何人都能指出我正确的方向吗?!

alp*_*ian 84

我知道这已经过时了,并在其他地方得到了回答 我不确定你为什么要动态下载WSDL但系统属性:

sun.net.client.defaultConnectTimeout (default: -1 (forever))
sun.net.client.defaultReadTimeout (default: -1 (forever))
Run Code Online (Sandbox Code Playgroud)

应该使用JAX-WS使用的HttpURLConnection应用于所有读取和连接.如果从远程位置获取WSDL,这应该可以解决您的问题 - 但本地磁盘上的文件可能更好!

接下来,如果要为特定服务设置超时,一旦创建了代理,就需要将其转换为BindingProvider(您已经知道),获取请求上下文并设置属性.在线JAX-WS文档是错误的,这些是正确的属性名称(嗯,它们适合我).

MyInterface myInterface = new MyInterfaceService().getMyInterfaceSOAP();
Map<String, Object> requestContext = ((BindingProvider)myInterface).getRequestContext();
requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 3000); // Timeout in millis
requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 1000); // Timeout in millis
myInterface.callMyRemoteMethodWith(myParameter);
Run Code Online (Sandbox Code Playgroud)

当然,这是一种可怕的做事方式,我会创建一个很好的工厂来生产这些绑定提供程序,可以注入你想要的超时.

  • 请注意,REQUEST_TIMEOUT/CONNECT_TIMEOUT属性实际上是从SUN内部类com.sun.xml.internal.ws.developer.JAXWSProperties继承的,并且(至少在32位Linux上)javac 1.6.0_27和javac 1.7.0_03未能编译此代码(类似于http://bugs.sun.com/view_bug.do?bug_id=6544224)...您需要将-XDignore.symbol.file传递给javac才能使其正常工作. (9认同)

jwa*_*ell 35

接受的答案中的属性对我不起作用,可能是因为我正在使用JAX-WS的JBoss实现?

使用一组不同的属性(可在JBoss JAX-WS用户指南中找到)使其工作:

//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");
Run Code Online (Sandbox Code Playgroud)

  • java.net链接坏了.https://github.com/javaee/metro-jax-ws/issues/1166 (3认同)
  • 我没有使用 JBoss,但只有此评论中的属性对我有用,没有其他作用。 (2认同)
  • 属性名称取决于JAX-WS实现.列表可以在这里找到:https://java.net/jira/browse/JAX_WS-1166 (2认同)

小智 12

这是我的工作解决方案:

// --------------------------
// SOAP Message creation
// --------------------------
SOAPMessage sm = MessageFactory.newInstance().createMessage();
sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");
sm.setProperty(SOAPMessage.CHARACTER_SET_ENCODING, "UTF-8");

SOAPPart sp = sm.getSOAPPart();
SOAPEnvelope se = sp.getEnvelope();
se.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/");
se.setAttribute("xmlns:xsd", "http://www.w3.org/2001/XMLSchema");
se.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");

SOAPBody sb = sm.getSOAPBody();
// 
// Add all input fields here ...
// 

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection();
// -----------------------------------
// URL creation with TimeOut connexion
// -----------------------------------
URL endpoint = new URL(null,
                      "http://myDomain/myWebService.php",
                    new URLStreamHandler() { // Anonymous (inline) class
                    @Override
                    protected URLConnection openConnection(URL url) throws IOException {
                    URL clone_url = new URL(url.toString());
                    HttpURLConnection clone_urlconnection = (HttpURLConnection) clone_url.openConnection();
                    // TimeOut settings
                    clone_urlconnection.setConnectTimeout(10000);
                    clone_urlconnection.setReadTimeout(10000);
                    return(clone_urlconnection);
                    }
                });


try {
    // -----------------
    // Send SOAP message
    // -----------------
    SOAPMessage retour = connection.call(sm, endpoint);
}
catch(Exception e) {
    if ((e instanceof com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl) && (e.getCause()!=null) && (e.getCause().getCause()!=null) && (e.getCause().getCause().getCause()!=null)) {
        System.err.println("[" + e + "] Error sending SOAP message. Initial error cause = " + e.getCause().getCause().getCause());
    }
    else {
        System.err.println("[" + e + "] Error sending SOAP message.");

    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这些配置是否等同于"javax.xml.ws.client.connectionTimeout"和"javax.xml.ws.client.receiveTimeout"? (3认同)

Dan*_*lan 9

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);
Run Code Online (Sandbox Code Playgroud)

这对我有用.

  • 这虽然使用了Apache CXF类,但最好在答案中添加它.CXF罐子包含它们的链接也会有很大帮助. (3认同)

Dom*_*nti 8

如果您在JDK6上使用JAX-WS,请使用以下属性:

com.sun.xml.internal.ws.connect.timeout  
com.sun.xml.internal.ws.request.timeout
Run Code Online (Sandbox Code Playgroud)

  • 在某些上下文中,您不知道运行时将使用哪个 JAXWS 版本(内部或独立)的编程时。两者非常兼容,除了这个超时功能。键是不同的(`com.sun.xml.internal.ws.connect.timeout` 与 `com.sun.xml.ws.connect.timeout`)以及定义它们的类(或接口)(`com.sun .xml.internal.ws.developer.JAXWSProperties`/`com.sun.xml.internal.ws.client.BindingProviderProperties` 与 `com.sun.xml.ws.developer.JAXWSProperties`/`com.sun.xml.ws .client.BindingProviderProperties`)。我最好的想法是设置两者,使用文字值作为键。 (2认同)

小智 5

如果您的应用服务器是 WebLogic(对我来说是 10.3.6),那么负责超时的属性是:

com.sun.xml.ws.connect.timeout 
com.sun.xml.ws.request.timeout
Run Code Online (Sandbox Code Playgroud)