用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。
反正都是不能恢复正常采集,要重启,我也是醉了。
麻烦各位亲帮我解答一下,问题可能出现在哪里,怎么让我的采集程序可以一口气跑完,不费劲。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
你这个情况无非2种可能
1.对方不让你看了
2.你的项目有问题
是否确定肯定是晚上12点之后就不行了?会不会是你每天重启的时间都差不多,导致看上去好像是12点之后不行的,重启的时间改到下午做看看会怎样。
我建议你最好能换一个网站采集,确定没有那种不让你看的限制,先排除掉自己程序的问题之后再去猜测对方是怎么配置的。