用HttpClient做数据采集时的阻塞问题
最近写了个程序采一个网站的信息,第一次。程序涉及到的工具是Java、MySQL、Apache的HttpClient。
HttpClient设置了连接超时、响应超时,都是一分钟。每采集一两个小时偶尔有一些请求在1分钟之内抛出
java.net.SocketTimeoutException: Read timed out
。这说明设置的超时是有效的。
听说抛出Read time out是因为采集太频繁,对方服务器有保护,所以我写了代码每次抛错就休眠2分钟再继续采集。
-
第一个问题是,程序在白天开始跑,好好的,但从晚上12点左右到第二天早上7、8点(有时是6点),完全没有打印一点日志信息,直到7、8点过后才抛出
java.net.SocketTimeoutException:
Read timed out ,而且一个每隔15分钟执行缓存清理的线程在这段时间内也没执行过。一头雾水。 -
第二个问题是由第一个问题连带引出来的,在我做过的3次测试里,7、8点过后程序“恢复采集”,但出现已下问题:
有一次曾经出现数据库连接已关闭的情况,但是数据库连接池已经配置好定期检查空闲连接,应该确保返回的连接是有效的啊。用的是BoneCP。
有两次数据库连接还能正常使用,但是对被采集的服务器发起的请求开始比较频繁地出现 Read timed out 。
反正都是不能恢复正常采集,要重启,我也是醉了。
麻烦各位亲帮我解答一下,问题可能出现在哪里,怎么让我的采集程序可以一口气跑完,不费劲。。。
冬天的鸡鸡真冷
9 years, 8 months ago
Answers
你这个情况无非2种可能
1.对方不让你看了
2.你的项目有问题
第一个问题是,程序在白天开始跑,好好的,但从晚上12点左右到第二天早上7、8点(有时是6点),完全没有打印一点日志信息,直到7、8点过后才抛出java.net.SocketTimeoutException:Read timed out,而且一个每隔15分钟执行缓存清理的线程在这段时间内也没执行过。
是否确定肯定是晚上12点之后就不行了?会不会是你每天重启的时间都差不多,导致看上去好像是12点之后不行的,重启的时间改到下午做看看会怎样。
我建议你最好能换一个网站采集,确定没有那种不让你看的限制,先排除掉自己程序的问题之后再去猜测对方是怎么配置的。
Moe小零
answered 9 years, 8 months ago