用HttpClient做数据采集时的阻塞问题


最近写了个程序采一个网站的信息,第一次。程序涉及到的工具是Java、MySQL、Apache的HttpClient。
HttpClient设置了连接超时、响应超时,都是一分钟。每采集一两个小时偶尔有一些请求在1分钟之内抛出 java.net.SocketTimeoutException: Read timed out 。这说明设置的超时是有效的。
听说抛出Read time out是因为采集太频繁,对方服务器有保护,所以我写了代码每次抛错就休眠2分钟再继续采集。

  1. 第一个问题是,程序在白天开始跑,好好的,但从晚上12点左右到第二天早上7、8点(有时是6点),完全没有打印一点日志信息,直到7、8点过后才抛出 java.net.SocketTimeoutException:
    Read timed out
    ,而且一个每隔15分钟执行缓存清理的线程在这段时间内也没执行过。一头雾水。
  2. 第二个问题是由第一个问题连带引出来的,在我做过的3次测试里,7、8点过后程序“恢复采集”,但出现已下问题:
    有一次曾经出现数据库连接已关闭的情况,但是数据库连接池已经配置好定期检查空闲连接,应该确保返回的连接是有效的啊。用的是BoneCP。
    有两次数据库连接还能正常使用,但是对被采集的服务器发起的请求开始比较频繁地出现 Read timed out
    反正都是不能恢复正常采集,要重启,我也是醉了。
    麻烦各位亲帮我解答一下,问题可能出现在哪里,怎么让我的采集程序可以一口气跑完,不费劲。。。

java 连接池 数据库 数据采集 httpclient

冬天的鸡鸡真冷 9 years, 9 months ago

你这个情况无非2种可能
1.对方不让你看了
2.你的项目有问题

第一个问题是,程序在白天开始跑,好好的,但从晚上12点左右到第二天早上7、8点(有时是6点),完全没有打印一点日志信息,直到7、8点过后才抛出java.net.SocketTimeoutException:Read timed out,而且一个每隔15分钟执行缓存清理的线程在这段时间内也没执行过。

是否确定肯定是晚上12点之后就不行了?会不会是你每天重启的时间都差不多,导致看上去好像是12点之后不行的,重启的时间改到下午做看看会怎样。

我建议你最好能换一个网站采集,确定没有那种不让你看的限制,先排除掉自己程序的问题之后再去猜测对方是怎么配置的。

Moe小零 answered 9 years, 9 months ago

Your Answer