Eu recebo uma SocketTimeoutException quando tento analisar vários documentos HTML usando Jsoup.
Por exemplo, obtive uma lista de links:
<a href="www.domain.com/url1.html">link1</a>
<a href="www.domain.com/url2.html">link2</a>
<a href="www.domain.com/url3.html">link3</a>
<a href="www.domain.com/url4.html">link4</a>
Para cada link, analiso o documento vinculado à URL (do atributo href) para obter outras informações nessas páginas.
Posso imaginar que demore muito, mas como desligar essa exceção?
Aqui está o rastreamento de pilha completo:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at java.io.BufferedInputStream.fill(Unknown Source)
at java.io.BufferedInputStream.read1(Unknown Source)
at java.io.BufferedInputStream.read(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at java.net.HttpURLConnection.getResponseCode(Unknown Source)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:381)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:364)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:143)
at org.jsoup.helper.HttpConnection.get(HttpConnection.java:132)
at app.ForumCrawler.crawl(ForumCrawler.java:50)
at Main.main(Main.java:15)
Obrigado camaradas!
EDIT: Hum ... Desculpe, acabei de encontrar a solução:
Jsoup.connect(url).timeout(0).get();
Espero que isso possa ser útil para outra pessoa ... :)
timeout(0)
isso fará com que o Jsoup conecte a url novamente e novamente até conectar.Respostas:
Eu acho que você pode fazer
que define o tempo limite para 10s.
fonte
Ok - então, tentei oferecer isso como uma edição à resposta do MarcoS, mas a edição foi rejeitada. No entanto, as seguintes informações podem ser úteis para futuros visitantes:
De acordo com os javadocs , o tempo limite padrão para um
org.jsoup.Connection
é 30 segundos.Como já foi mencionado, isso pode ser definido usando
timeout(int millis)
Além disso, como as notas de OP na edição, isso também pode ser definido usando
timeout(0)
. No entanto, como os javadocs afirmam:fonte
Há um erro em https://jsoup.org/apidocs/org/jsoup/Connection.html . O tempo limite padrão não é 30 segundos. São 3 segundos. Basta olhar para javadoc em códigos. Diz 3000 ms.
fonte
Eu tive o mesmo erro:
e apenas a configuração
.userAgent(Opera)
funcionou para mim.Então, usei o
Connection userAgent(String userAgent)
método da classe Connection para definir o agente de usuário Jsoup.Algo como:
fonte
Isso deve funcionar:
Jsoup.connect(url.toLowerCase()).timeout(0);
.fonte
Defina o tempo limite durante a conexão do jsoup.
fonte