【问题标题】:Most efficient java way to test 300,000+ URLs [duplicate]测试 300,000 多个 URL 的最有效 Java 方法 [重复]
【发布时间】:2013-03-05 18:16:41
【问题描述】:

我正在尝试寻找最有效的方法来测试数据库中的 300,000 多个 URL,以基本上检查这些 URL 是否仍然有效。 环顾该网站后,我发现了许多出色的答案,现在正在使用以下内容:

从文件中读取 URL.... 测试网址:

        final URL url = new URL("http://" + address);
        final HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
        urlConn.setConnectTimeout(1000 * 10);
        urlConn.connect();
        urlConn.getResponseCode(); // Do something with the code
        urlConn.disconnect();

将详细信息写回文件....

所以有几个问题: 1) 有没有更有效的方法来测试 URL 和获取响应码?

2) 最初我可以每分钟测试大约 50 个 URL,但在 5 分钟左右之后,事情真的变慢了 - 我想有一些资源我没有发布,但不确定是什么

3) 即使设置了连接超时,某些 URL(例如 www.bhs.org.au)也会导致上述内容挂起几分钟(当我有这么多 URL 要测试时不好),无论如何我可以收紧吗到这里了吗?

在此先感谢您的帮助,自从我编写任何代码以来已经有好几年了,我又要从头开始了 :-)

【问题讨论】:

  • stackoverflow.com/a/272918/166390 - 就缓解阻塞或增加吞吐量而言,请参阅线程或其他分布
  • 我不太了解Java,但为了避免(3),我建议从多个线程进行连接。我会创建一个线程池,随时保持 20-50 个连接。这样,超时不会阻塞系统。

标签: java url httpurlconnection


【解决方案1】:

到目前为止,最快的方法是使用java.nio 在端口 80 上打开到目标主机的常规 TCP 连接。然后,只需向它发送一个最小的 HTTP 请求并自己处理结果。

这样做的主要优点是您可以同时打开和加载 10 或 100 甚至 1000 个连接的池,而不必一个接一个地进行。例如,这样一来,如果一台服务器 (www.bhs.org.au) 需要几分钟来响应,这并不重要。它只会占用池中的众多连接之一,但其他连接会继续运行。

您还可以通过使用Thread Pool 在多个线程中并行运行多个HttpURLConnections(您现在的操作方式)来实现同样的目标,但需要更多开销但编码更简单。

【讨论】:

    【解决方案2】:

    这可能有帮助,也可能没有帮助,但您可能希望将请求方法更改为HEAD,而不是使用默认的GET

    urlConn.setRequestMethod("HEAD");
    

    这告诉服务器,除了响应代码之外,您真的不需要回复。

    文章What Is a HTTP HEAD Request Good for描述了HEAD的一些用途,包括链接验证:

    [Head] 请求的响应与对应于 GET 请求的响应相同,但没有响应正文。这对于检索写入响应标头中的元信息很有用,而无需传输整个内容......这可用于例如创建更快的链接验证服务。

    【讨论】:

    • 链接已失效。这是another one,标题相同。不知道内容是不是也一样。
    • 谢谢@Alexander,我已经更新了链接。
    猜你喜欢
    • 1970-01-01
    • 2015-03-14
    • 2013-05-31
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多