【问题标题】:Setting socket read timeout with javax.xml.soap.SOAPConnection使用 javax.xml.soap.SOAPConnection 设置套接字读取超时
【发布时间】:2012-03-21 03:39:09
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: java saaj


【解决方案1】:

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

【讨论】:

  • 您是否将传递给 openConnection 的 URL 转换为 String 并返回以防止 target.openConnection 使用正在定义的 URLStreamHandler?
  • 这是一个很好的观点。我没有测试过自己,但我认为你猜对了:无限递归已关闭;)老实说,我从这里得到代码:stackoverflow.com/questions/2148915/…
  • 这很有趣,我想我看到了那个问题但没有看答案,因为这是一个不同的问题(我认为这个答案并没有真正解决)。
  • 你是对的。老式 SOAP API(你的问题)和新的基于 JAX-WS 注释的 API(Zaki 的答案在这里)之间经常存在错误
  • 我很确定这不再起作用了。两个超时都被 call 方法中的HttpSOAPConnection(1.5.2 版本)覆盖。
【解决方案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();

}

【讨论】:

  • 什么是Service?我想您可能回答的问题与我所问的不同。
  • 这个sn-p对应使用JAX-WS注解通过它的WSDL获取一个webservice的服务端口
【解决方案3】:

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

saaj.connect.timeout

saaj.read.timeout

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2012-11-12
    • 1970-01-01
    相关资源
    最近更新 更多