10

我试图找到最有效的方法来测试数据库中的 300,000 多个 URL,以基本上检查这些 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 要测试时不好),有什么办法可以收紧吗?

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

4

2 回答 2

5

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

urlConn.setRequestMethod("HEAD");

这告诉服务器您实际上不需要响应,除了响应代码。

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

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

于 2013-03-05T18:28:59.897 回答
5

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

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

您还可以通过使用线程池HttpURLConnections在多个线程中并行运行许多(您现在正在执行的方式)来实现同样的事情,但需要更多的开销,但编码的复杂性要低得多。

于 2013-03-05T18:29:10.860 回答