我正在尝试使用JSoup下载页面内容。如果整个操作(打开连接+读取)超过8秒,我想立即中止。我假设timeout(int millis)
方法的目的就是做到这一点。根据javadoc:
我写了一个简单的代码来模拟这个操作:设置请求超时(连接和读取)。如果出现超时,则使用IOException将被抛出。默认超时时间为3秒(3000)米尔斯)。超时值为0被视为无限超时。
final int TIME_OUT = 8000;
final String USER_AGENT_STRING = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
final String url = "http://reguler-pmb-tanggamus.va.web.id/";
long time = System.currentTimeMillis();
try {
Document doc = Jsoup.connect(url).userAgent(USER_AGENT_STRING).timeout(TIME_OUT).get();
System.out.println("Done crawling " + url + ", took " + (System.currentTimeMillis() - time) + " millis");
System.out.println("Content: " + doc);
} catch (Exception e) {
System.out.println("Failed after " + (System.currentTimeMillis() - time) + " millis");
e.printStackTrace();
}
我试图运行这个小脚本在几个"有问题"的网站在单线程环境。我假设无论是成功还是捕获异常,操作时间都不应超过8秒(8000毫秒)。不幸的是,情况并非如此,因为有时在超过一分钟后它会成功(没有例外):
Done crawling http://reguler-pmb-tanggamus.va.web.id/, took 68215 millis
Content: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ...
并且有时(虽然很少)在超过一分钟后失败(SocketTimeoutException)。
以前有人遇到过这种问题吗?
OP面临的问题似乎是Jsoup 1.8.3中的一个bug。
我能重现你的发现。我建议你提交一个bug报告@ github.com/jhy/jsoup/issues (luksch)
OP: https://github.com/jhy/jsoup/issues/628
JSoup团队(jhy)回应了我的问题:
设置连接和读取超时。读超时是指时间读取之间。如果你的服务器长时间输出内容时间,不过是每读一次而已;8秒,不会超时。
实现一个最大定时器可能很好,但事实并非如此直接(需要一个监视线程和一种实用的方法)关闭连接),这是很多人没有的要求。
似乎这个问题不会很快得到解决。
/**
* Set the maximum bytes to read from the (uncompressed) connection into the body, before the connection is closed,
* and the input truncated. The default maximum is 1MB. A max size of zero is treated as an infinite amount (bounded
* only by your patience and the memory available on your machine).
* @param bytes number of bytes to read from the input before truncating
* @return this Connection, for chaining
*/
Connection maxBodySize(int bytes);
Jsoup默认的recv最大值是1MB
set "Jsoup.connect(url).maxBodySize(0);"