Jsoup连接和重试

时间:2012-05-08 21:11:47

标签: java connection jsoup

我正在使用JSoup来连接网站。我有时会发现JSoup会有连接超时,当发生这种情况时,我希望JSoup重试连接,当它第3次失败时,它会将一个字符串添加到数组列表中。

目前我的代码是:

try {
        Document doc = Jsoup.connect(sitemapPath)
                .userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21")
                .timeout(10000)
                .get();

        Elements element = doc.select("loc");
        return element;
    } catch (IOException e) {
        return null;
    }

我正在考虑使用while循环做一些事情,但我必须返回元素,所以我不确定如何做到这一点。

2 个答案:

答案 0 :(得分:6)

    ArrayList<String> l = new ArrayList();
    Document doc = null;
    int i = 0;
    boolean success = false;

    while( i < 3){
        try {
            doc = Jsoup.connect(sitemapPath).get();
            success = true;
            break;
        } catch (SocketTimeoutException ex){
            l.add("text...");               
        }
        catch (IOException e) {
        }           
        i++;
    }

    if(success){
        // Selector code ...
        Elements element = doc.select("loc");
    }

答案 1 :(得分:0)

根据Rodri_gore的回答,这是一个稍微简洁的版本。它使用for循环而不是一段时间,并利用&#34; doc&#34;如果循环在三次超时后正常退出,则只会为null。

这是因为我捕获SocketTimeoutException。如果我试图在同一个try / catch块中捕获其他异常,则逻辑将不再成立。 &#34;文档&#34;可能为null,因为发生了不同的异常。

顺便说一句,您可以使用http://www.google.com:81/ 测试超时错误

  Document doc = null;

  for (int i = 1; i <= 3; i++) {
      try{
          doc = Jsoup.connect(url).get();
          break; // Break immediately if successful
      }
      catch (SocketTimeoutException e){
          // Swallow exception and try again
          logger.warn("jsoup Timeout occurred " + i + " time(s)");
      }                 
  }

  if (doc == null){
      // Timed out 3 times. Do whatever you want here.
  }
  else{
      // Do something with doc
  }

我通常使用此代码创建一个实用程序方法,然后调用此方法传递url或连接对象。然后我在try catch中包装该方法调用来处理jsoup可能抛出的所有其他异常。