2012-03-02 78 views
11

我正在使用javax.xml.soap API(javax.xml.soap.SOAPConnectionFactory,javax.xml.soap.SOAPConnection和朋友)向远程服务器发起Web服务调用,这在很大程度上取得了巨大成功。使用javax.xml.soap.SOAPConnection设置套接字读取超时

但是,有时候会出现问题,程序会永远被卡住。

为了解决这个问题,我想添加一个读取超时。

我发现了几种可能实现这一目标的方法,但它们都很糟糕。

所以我对社区的问题是:当使用javax.xml.soap API进行调用时,实现读取超时行为的最佳方式是什么?

+0

嗨塞缪尔 请看下面的问题,因为它与你的问题有相同的上下文。 希望你能在这里提出建议 https://stackoverflow.com/questions/47861767/http-connect-timeout-and-read-timeout-for-urlstreamhandler-with-saaj-working-fo – 2017-12-21 07:00:02

回答

26

你必须创建自己的URLStreamHandler,让您可以设置URLConnection参数,如连接超时和读取超时。

SOAPConnection connection = SOAPConnectionFactory.newInstance().createConnection(); 
URL endpoint = 
    new URL(new URL("http://yourserver.yourdomain.com/"), 
      "/path/to/webservice", 
      new URLStreamHandler() { 
      @Override 
      protected URLConnection openConnection(URL url) throws IOException { 
       URL target = new URL(url.toString()); 
       URLConnection connection = target.openConnection(); 
       // Connection settings 
       connection.setConnectTimeout(10000); // 10 sec 
       connection.setReadTimeout(60000); // 1 min 
       return(connection); 
      } 
      }); 

SOAPMessage result = connection.call(soapMessage, endpoint); 

为了清晰起见,我删除了一些try/catch。

+0

您是否将传递给openConnection的URL转换为字符串并返回以防止target.openConnection使用正在定义的URLStreamHandler? – 2012-03-16 20:02:25

+0

这是一个很好的观点。我没有测试过自己,但我认为你猜对了:无限递归是关闭的;)老实说,我从这里得到的代码:http://stackoverflow.com/questions/2148915/how-do-i-set-超时为一个jax-ws-webservice-client – 2012-03-16 21:38:21

+0

这很有趣,我想我看到了这个问题,但没有看到答案,因为这是一个不同的问题(我不认为这个答案真的解决了) 。 – 2012-03-16 23:54:06

2
import com.sun.xml.internal.ws.client.BindingProviderProperties 

public someResponse callWebService() { 

    MyPort port = new Service().getPort(); 

    Map<String, Object> requestContext = ((BindingProvider) port).getRequestContext(); 

    requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT, 10 * 1000); //10 secs 

    requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT, 1 * 60 * 1000); //1 min 

    return port.someWebMethod(); 

} 
+0

什么是'Service'?我想你可能会回答一个与我所问的不同的问题。 – 2012-03-02 18:16:55

+0

这段代码对应于使用JAX-WS批注通过其WSDL – 2012-03-13 15:57:43

+0

获得服务端口到Web服务,这非常有用。 – 2013-07-11 20:31:31

相关问题