最有效的java方式来测试300,000多个URL

时间:2013-03-05 18:16:41

标签: java url httpurlconnection

我正在尝试找到在数据库中测试300,000多个网址的最有效方法,以基本检查网址是否仍然有效。 环顾网站后,我发现了许多优秀的答案,现在正在使用以下内容:

从文件中读取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个网址,但是在大约5分钟之后,事情真的变慢了 - 我想有一些资源我不会发布但不确定是什么

3)某些网址(例如www.bhs.org.au)会导致上述情况持续数分钟(即使设置了连接超时,我还有很多网址可以测试),无论如何我都可以收紧这个?

提前感谢您提供任何帮助,自从我编写任何代码以来,我已经从头开始了很长一段时间了: - )

2 个答案:

答案 0 :(得分:5)

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

urlConn.setRequestMethod("HEAD");

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

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

  

[Head]要求响应与对应于GET请求的响应相同,但没有响应主体。这对于检索在响应头中编写的元信息非常有用,而无需传输整个内容....这可用于创建更快的链接验证服务。

答案 1 :(得分:5)

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

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

通过使用Thread Pool以多个并行方式运行多个HttpURLConnections(现在的方式),您也可以通过稍微增加开销实现同样的功能,但复杂度要低得多线程。