HttpURLConnection getResponseCode()方法阻塞

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

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

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

HttpURLConnection getResponseCode()方法阻塞_第1张图片

可见,问题出在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超时时间 运行一段时间看看吧。




你可能感兴趣的:(JAVA)