2012-05-16 1 views
-1

Я написал небольшой фрагмент кода, который должен скачать текст данного сайта с помощью Jsoup (1.6.2).Jsoup Timeout не работает должным образом

public String readPage(String url) { 

    try { 

     long start = System.currentTimeMillis(); 
     String text = Jsoup.connect(url).timeout(10000).get().html(); 
     System.out.println(System.currentTimeMillis() - start); 
     return text; 
    } 
    catch (IOException e) { 

     // we need to do this because the log file is flooded with useless error messages 
     if (e.getMessage().contains("Unhandled content type") || 
      e.getMessage().contains("Premature EOF") || 
      e.getMessage().contains("Read timed out") || 
      e.getMessage().contains("403 error loading URL") || 
      e.getMessage().contains("404 error loading URL") || 
      e.getMessage().contains("405 error loading URL") || 
      e.getMessage().contains("500 error loading URL") || 
      e.getMessage().contains("503 error loading URL")) { 

      logger.debug(String.format("Error crawling website: %s", url)); 
     } 
     else logger.error(String.format("Error crawling website: %s", url), e); 
    } 

    return ""; 
} 

Я начинаю этот метод внутри списка потоков, каждый поток, ответственный за загрузку одного сайта. С моей точки зрения (и это, очевидно, неверно), каждый system.out должен показывать число ниже 10000, потому что Jsoup должен выбросить исключение. Но это не тот случай, когда в stdout есть периоды, превышающие 100k.

Как это возможно и что я делаю неправильно?

Приветствия Daniel

ответ

1

Это меня не удивляет. Есть много вещей, происходящих между тем, когда вы получаете время начала и время окончания. Соединение могло быть сделано до крайнего срока, и ваше конечное время может легко выйти за крайний срок в зависимости от того, насколько быстро загружаются загрузки (особенно, поскольку вы делаете несколько одновременно).

Вы прокомментировали:

Я извиняюсь, но не могли бы вы объяснить это более подробно?

У вас есть эта строка:

String text = Jsoup.connect(url).timeout(10000).get().html(); 

который вызывается несколькими потоками одновременно. Представьте себе сценарий, в котором все они будут быстро подключаться, но для их загрузки потребуется время, чтобы загрузить информацию и обработать ее, особенно со многими потоками, конкурирующими за один и тот же ресурс.

+0

Извините, но не могли бы вы объяснить это более подробно? –

+0

@ Даниэль: см. Править –

1

Предположим, что thread 1 выполняет long start = System.currentTimeMillis(), а системный планировщик останавливает эту первую нить и запускает вторую. Второй поток вызывает long start = System.currentTimeMillis() и останавливается для 3-го потока, чтобы вызвать его код.

Это неопределенное значение - системный планировщик может назначить запуск n-го потока после завершения всех потоков - System.out.println может быть до тех пор, пока все длительности потоков.

Тайм-аут работает, но проблема с резьбой здесь.