2012-05-08 1 views
1

Я использую JSoup для подключения к веб-сайту. Я иногда обнаруживаю, что JSoup будет иметь таймаут соединения, когда это произойдет, я хочу, чтобы JSoup повторил соединение, и когда он не работает в третий раз, он должен добавить строку в список массивов.Соединения и повторы Jsoup

Мой код на данный момент:

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; 
    } 

Я думал, что-то делать с в то время как петли, но я должен вернуть элемент, так что я не уверен, как это сделать.

ответ

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"); 
    } 
+0

Для чего нужен arraylist? – user1810737

+1

Пожалуйста, прочитайте вопрос. («... и когда он терпит неудачу в третий раз, он добавит строку в список массивов»). –

+0

Текущая версия этого решения будет называть 'l.add (« текст ... »); 'каждый раз, когда генерируется' 'SocketTimeoutException'. Поэтому он может добавлять текст до трех раз, а не только *, когда он терпит неудачу в третий раз *. – Abdull

0

Это немного более краткий вариант, основанный на ответе Родриггоре. Он использует цикл for вместо времени и использует тот факт, что «doc» будет только нулевым, если цикл завершается нормально после трех тайм-аутов.

Это тот случай, потому что я только ловли SocketTimeoutException. Если я попытался поймать другие исключения в одном и том же блоке try/catch, тогда логика больше не будет выполняться. «doc» может быть нулевым, поскольку произошло другое исключение.

Кстати, вы можете использовать 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 может отбрасывать.