随机出现的java.net.ConnectException

时间:2015-06-19 20:21:05

标签: java servlets web-scraping

我以随机方式遇到java.net.ConnectException。

我的servlet在Tomcat 6.0(JDK 1.6)中运行。 servlet定期从4-5个第三方Web服务器获取数据。 servlet使用ScheduledExecutorService来获取数据。

在本地运行,一切都很好,花花公子。在我的prod服务器上运行,我发现从一个第三方获取数据的半随机失败(加拿大天气数据)。

这些是失败的网址(普通RSS Feed):

奇怪:每个周期,当我定期获取这些数据时,成功/失败都在地图上:有些成功,有些失败,但它似乎永远不会相同两次。所以,我没有被完全阻止,只是被随机阻止。

我通过在每个之间引入一个61秒的暂停来减慢我的速度。那没有效果。

执行实际获取的代码的内容:

  private static final int TIMEOUT = 60*1000; //msecs

  public String fetch(String aURL, String aEncoding /*UTF-8*/) {
    String result = "";
    long start = System.currentTimeMillis();
    Scanner scanner = null;
    URLConnection connection = null;
    try {
      URL url = new URL(aURL);
      connection =  url.openConnection(); //this doesn't talk to the network yet
      connection.setConnectTimeout(TIMEOUT); 
      connection.setReadTimeout(TIMEOUT);
      connection.connect(); //actually connects; this shouldn't be needed here
      scanner = new Scanner(connection.getInputStream(), aEncoding); 
      scanner.useDelimiter(END_OF_INPUT);
      result = scanner.next();
    }
    catch (IOException ex) {
      long end = System.currentTimeMillis();
      long time = end - start;
      fLogger.severe(
        "Problem connecting to " + aURL + " Encoding:" + aEncoding + 
        ". Exception: " + ex.getMessage() + " " + ex.toString() + " Cause:" +  ex.getCause() + 
        " Connection Timeout: " + connection.getConnectTimeout() + "msecs. Read timeout:" + 
        connection.getReadTimeout() + "msecs."
        + " Time taken to fail: " + time + " msecs."
      );
    }
    finally {
      if (scanner != null) scanner.close();
    }
    return result;
  }

显示失败的示例日志条目:

SEVERE: Problem connecting to http://weather.gc.ca/rss/city/pe-5_e.xml Encoding:UTF-8. 
Exception: Connection timed out java.net.ConnectException: Connection timed out 
Cause:null 
Connection Timeout: 60000msecs. 
Read timeout:60000msecs. 
Time taken to fail: 15028 msecs.  

请注意,失败的时间总是15秒+一小部分。 另请注意,它无法达到配置的60秒超时连接。

主机服务器管理员(加拿大环境部)声明他们没有任何类型的行为不端客户的IP地址黑名单。

同样重要的是:代码已经运行了几个月没有发生这种情况。

1 个答案:

答案 0 :(得分:0)

有人建议我应该使用curl,bash脚本和cron。我实现了它,它工作正常。

我无法使用Java解决此问题。