2

我有一个爬虫 Java 应用程序,它应该连接到一些 HTTP 服务器,下载其页面的 HTML 内容,然后转到其他 HTTP 服务器。对于这个任务,我使用了 Apache HTTP 库。

在运行的前几个小时,事情似乎运行得相当顺利(有时会抛出一些与连接相关的异常,但这是意料之中的)。然而过了一段时间,我似乎在我发出的每个请求上都收到了 SocketTimeoutException。HttpClient 类的“执行”方法不会发生异常,而是当我尝试获取实体的内容(我从 HttpResponse 对象检索),或者当我尝试将该内容写入文件时。

然后,如果我停止应用程序并重新启动它,事情似乎又可以正常工作了——即使它从停止的地方开始,这意味着它正在与我在尝试交互时收到 SocketTimeoutException 的同一台服务器进行交互与之前。

我尝试寻找可能缺少的各种可能的清理方法,并且在使用这个库时可能是必不可少的,但找不到任何东西。

任何帮助将不胜感激。谢谢。

4

2 回答 2

1

如果在客户端库等待检索池连接时发生超时,这听起来可能是由连接池引起的,当你完成它们时你没有关闭它们。您确定您正在正确关闭所有内容(在finally语句中)吗?

如果您运行Wireshark来监控您的流量,当它“中断”时会发生什么网络流量?

于 2012-01-08T09:03:39.217 回答
0

确保您没有同时使用大量 http 请求。例如,发送 5 个 http 请求,并等待第一个响应。然后你可以发出另一个请求等。看起来你的 http 请求打开了太多的套接字。

于 2012-01-08T10:12:34.477 回答