मुझे Jsoup में एक सॉकेटटाइमआउट अपवाद मिलता है: समयबद्ध पढ़ें


100


जब मुझे Jsoup का उपयोग करके बहुत सारे HTML दस्तावेज़ों को पार्स करने का प्रयास किया जाता है तो मुझे सॉकेट टाइमआउट अपवाद मिलता है।
उदाहरण के लिए, मुझे लिंक की एक सूची मिली:

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

प्रत्येक लिंक के लिए, मैं उन पृष्ठों में जानकारी के अन्य टुकड़े प्राप्त करने के लिए URL (href विशेषता से) से जुड़े दस्तावेज़ को पार्स करता हूं।
तो मैं सोच सकता हूं कि इसमें बहुत समय लगता है, लेकिन इस अपवाद को कैसे बंद करें?
यहाँ पूरे स्टैक ट्रेस है:

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)

धन्यवाद दोस्तों!

संपादित करें: हम ... क्षमा करें, बस समाधान मिला:

Jsoup.connect(url).timeout(0).get();

आशा है कि किसी और के लिए उपयोगी हो सकता है ... :)


3
आपके द्वारा संपादित किए गए कोड में अनंत के लिए मध्यांतर निर्धारित होता है। यह ज्यादातर उपयोग के मामलों में अवांछनीय है। मार्कोस उत्तर में दिए गए संकेत के अनुसार, एक विशिष्ट टाइमआउट का उपयोग करना बेहतर है, भले ही टाइमआउट लंबा हो।
स्टेपियन

2
मुझे लगता है कि timeout(0)Jsoup url को बार-बार कनेक्ट करेगा जब तक कि यह कनेक्ट नहीं हो जाता।
इवान हू

जवाबों:


138

मुझे लगता है कि आप कर सकते हैं

Jsoup.connect("...").timeout(10 * 1000).get(); 

जो 10s के लिए टाइमआउट सेट करता है।


3
121 अपवोट्स लेकिन इस बात का कोई स्पष्टीकरण नहीं कि यह समस्या को क्यों ठीक करता है? डिफॉल्ट होने पर वह समस्या का समाधान क्यों करता है, यह 30 सेकंड में दिखाई देगा?
एलन हाय

2
@AlanHay मेरा जवाब एक टाइमआउट सेट करके समस्या को हल करने का सुझाव दे रहा था, टाइमआउट के रूप में उस विशिष्ट मूल्य का उपयोग न करके :)
MarcoS

26

ठीक है - इसलिए, मैंने इसे मार्कोस के उत्तर को संपादित करने के रूप में पेश करने की कोशिश की, लेकिन संपादन अस्वीकार कर दिया गया। फिर भी, निम्नलिखित जानकारी भविष्य के आगंतुकों के लिए उपयोगी हो सकती है:

Javadocs के अनुसार , एक 30 सेकंड के लिए डिफ़ॉल्ट टाइमआउटorg.jsoup.Connection है।

जैसा कि पहले ही उल्लेख किया गया है, इसका उपयोग करके सेट किया जा सकता है timeout(int millis)

इसके अलावा, एड में ओपी नोट्स के रूप में, यह भी उपयोग करके सेट किया जा सकता है timeout(0)। हालाँकि, javadocs राज्य के रूप में:

शून्य के एक टाइमआउट को अनंत समय के रूप में माना जाता है।


3
ज्यादातर मामलों में एक अनंत समय निर्धारित करना एक बुरा विचार है। एक लंबी समयावधि का उपयोग करें, लेकिन हमेशा एक निर्दिष्ट करें। मार्को उत्तर देखें।
स्टेपियन

3
@stepanian - स्पष्ट होने के लिए, मैं एक अनंत टाइमआउट स्थापित करने की वकालत नहीं कर रहा हूं। यह ओपी द्वारा समाधान के रूप में सुझाया गया था, हालांकि मैं भविष्य के उपयोगकर्ताओं को इसके निहितार्थों को निर्देशित करना चाहता था। दरअसल, जब मैंने मूल रूप से अपना 'उत्तर' पोस्ट किया, तो मैंने संकेत दिया कि मुझे लगा कि यह मैक्रों के उत्तर का एक संपादन होना चाहिए, क्योंकि कुछ अतिरिक्त जानकारी थी जो भविष्य के उपयोगकर्ताओं के लिए उपयोगी हो सकती है ... लेकिन संपादन अस्वीकार कर दिया गया था।
१ment:५०

डिफ़ॉल्ट टाइमआउट 3 सेकंड नहीं है, लेकिन 30 सेकंड (30000 मिली), आप इसे jsoup.org/apidocs/org/jsoup/Connection.html
aldok

3

Https://jsoup.org/apidocs/org/jsoup/Connection.html पर गलती है । डिफ़ॉल्ट टाइमआउट 30 सेकंड नहीं है। यह 3 सेकंड है। बस कोड में javadoc को देखें। इसे 3000 मि।


1
जावा डॉक पर: "डिफ़ॉल्ट टाइमआउट 30 सेकंड (30,000 मिली) है। शून्य के टाइमआउट को अनंत टाइमआउट माना जाता है।" jsoup.org/apidocs/org/jsoup/Connection.html
जेटॉन

3

मेरे पास एक ही त्रुटि थी:

java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:171)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)

और केवल सेटिंग .userAgent(Opera)ने मेरे लिए काम किया।

इसलिए मैंने Connection userAgent(String userAgent)Jsoup उपयोगकर्ता एजेंट को सेट करने के लिए कनेक्शन वर्ग की विधि का उपयोग किया ।

कुछ इस तरह:

Jsoup.connect("link").userAgent("Opera").get();


-6

Jsoup से कनेक्ट करते समय टाइमआउट सेट करें।


2
कृपया अपने उत्तर के बारे में जानकारी जोड़ें
जो

यदि आवश्यक हो तो स्पष्टीकरण और कोड स्निपेट के साथ अपने उत्तर का समर्थन करें।
स्वप्निल बी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.