您的位置:首页 > 理论基础 > 计算机网络

HttpURLConnection getResponseCode()方法阻塞

2016-06-04 18:07 1386 查看
     近期Quartz抓取程序是不是会阻塞,一直以为是Quartz版本太低存在bug。今天又阻塞了,无法容忍了,开始找原因:

1、先从日志中找到了执行job的线程 “2016-06-03 23:45:12,579 [TOPST_Quartz_Worker-13]”

2、使用jstack命令查看线程堆栈



可见,问题出在HttpURLConnection的getResponseCode()方法上,线程一直处于运行状态,但是被阻塞在了at java.net.SocketInputStream.socketRead0(Native Method)

3、检查代码

// 构造URL
URL url = new URL(imagePath);
// 打开连接
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestProperty("contentType", "UTF-8");
// 设置请求超时为5s
con.setConnectTimeout(5 * 1000);
con.setRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");
if (con.getResponseCode() == 200) {
...
}也设置了超时时间。
4、尝试查找“java.net.SocketInputStream.socketRead0(Native Method)”阻塞的原因,没有靠谱的解决方案。后来看到http://blog.csdn.net/h3c4lenovo/article/details/9985719

这篇文章才发现没有设置readTimeout,加上代码con.setReadTimeout(10_1000);// 设置getInputStream超时时间
运行一段时间看看吧。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: