Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JSoup超时未按预期工作_Java_Timeout_Jsoup_Socket Timeout Exception - Fatal编程技术网

Java JSoup超时未按预期工作

Java JSoup超时未按预期工作,java,timeout,jsoup,socket-timeout-exception,Java,Timeout,Jsoup,Socket Timeout Exception,我正在尝试使用JSoup下载页面内容。 如果整个操作(打开连接+读取)耗时超过8秒,我想立即中止。我假设timeout(int millis)方法的目的正是这样。 根据javadoc: 设置请求超时(连接和读取)。如果发生超时,则 将抛出IOException。默认超时为3秒(3000秒) 米利斯)。零超时被视为无限超时 我编写了一个模拟该操作的简单代码: final int TIME_OUT = 8000; final String USER_AGENT_STRING = "M

我正在尝试使用JSoup下载页面内容。 如果整个操作(打开连接+读取)耗时超过8秒,我想立即中止。我假设
timeout(int millis)
方法的目的正是这样。 根据javadoc:

设置请求超时(连接和读取)。如果发生超时,则 将抛出IOException。默认超时为3秒(3000秒) 米利斯)。零超时被视为无限超时

我编写了一个模拟该操作的简单代码:

    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"> ...
完成爬网http://reguler-pmb-tanggamus.va.web.id/,需要68215毫秒
内容:。。。
有时(尽管很少)会在一分钟后失败(SocketTimeoutException)


以前有人遇到过这种问题吗?

OP面临的问题似乎是JSOUP1.8.3中的一个bug


我能重现你的发现。我建议您提交一份bug报告@github.com/jhy/jsoup/issues()

OP提供了一个问题:

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


设置“Jsoup.connect(url).maxBodySize(0);”可能会修复它

您使用的是哪个版本的JSoup?我使用的是JSoup版本1.8.3I,我能够重现您的发现。我建议您提交一份bug报告@问题已经提交,谢谢