我正在尝试找到在数据库中测试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)会导致上述情况持续数分钟(即使设置了连接超时,我还有很多网址可以测试),无论如何我都可以收紧这个?
提前感谢您提供任何帮助,自从我编写任何代码以来,我已经从头开始了很长一段时间了: - )
答案 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
(现在的方式),您也可以通过稍微增加开销实现同样的功能,但复杂度要低得多线程。