17

我正在使用javax.xml.soapAPI(javax.xml.soap.SOAPConnectionFactory、、javax.xml.soap.SOAPConnection和朋友)对远程服务器进行 Web 服务调用,大部分情况下都取得了巨大的成功。

但是,有时会出现问题,程序会永远无法读取。

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

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

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

4

3 回答 3

37

您必须创建自己的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);

为了清楚起见,我删除了一些尝试/捕获。

于 2012-03-13T16:22:42.683 回答
3
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();

}
于 2012-03-02T16:34:33.550 回答
2

对于 saaj 实现(版本 1.5.2),可以设置 Java 系统属性

saaj.connect.timeout

saaj.read.timeout

值是以毫秒为单位的超时。

于 2021-07-09T13:35:49.817 回答