坑了我几天的http send request死锁
不知道哪家渠道或者广告主,可能使用deepsync返回了一个 itms-appss://这样的地址,最终导致广告追踪服务全部卡住。
最后 kill -3 JVM_PID 查看到 worker thread 是 runnable 但是一直在 socketread状态,最终通过stack trace看到卡在了GET同步。为何? GET同步卡死了——一直没有没有过期超时!
最终测试发现必须如下明显地去设置超时时间,否则遇到有的url就是死路一条:
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
比如 错误的域名会报错,但是给个http://1.1.1.1,必会发现GET同步卡死了(哪怕超时了,也是在你已经要绝望了的时候,两分钟以上都是常见,个人猜测是否跟系统socket超时设置有关)。
-------------------------------------------------------------------------------------
解决HttpURLConnection setConnectTimeout超时无响应的问题
使用getResponseCode()方法超时了却阻塞了线程,原因是指设置了setConnectTimeout没有设置setReadTimeout参数导致的
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
-------------------------------------------------------------------------------------
System.setProperty(“sun.net.client.defaultConnectTimeout”, “30000″);
System.setProperty(“sun.net.client.defaultReadTimeout”, “30000″);
JDK 1.5以前的版本,只能通过设置这两个系统属性来控制网络超时。在1.5中,还可以使用HttpURLConnection的父类URLConnection的以下两个方法:
setConnectTimeout:设置连接主机超时(单位:毫秒)
setReadTimeout:设置从主机读取数据超时(单位:毫秒)
例如:
HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();
urlCon.setConnectTimeout(30000);
urlCon.setReadTimeout(30000);
-------------------------------------------------------------------------------------
httpConn = (HttpURLConnection) url.openConnection();
//A URL connection can be used for input and/or output. Set the
//DoInput flag to true if you intend to use the URL connection for input,
//false if not. The default is true.
//URL连接可用于input或output。如果想用URL连接输入,设置DoInput标签为true。
//输入和输出是针对计算机的,如果以程序员的角度考虑,经常弄混。
//input输入,output输出,那么不是从output里read,input中write吗,其实相反
//input输入进计算机,计算机才能读,所以是从input read,而output是计算机输出,通过output write。
httpConn.setDoOutput(false);
//所以如果setDoInput(false),想从URLConnection读取时不能读取
//Cannot read from URLConnection if doInput=false (call setDoInput(true))
httpConn.setDoInput(true);
//连接建立超时时间还有读取数据超时时间,
httpConn.setConnectTimeout(600000);
httpConn.setReadTimeout(600000);
httpConn.setRequestMethod("GET");
httpConn.connect();
//获取状态码
intcode = httpConn.getResponseCode();
System.out.println(code);
//读http请求响应
BufferedReader reader =newBufferedReader(newInputStreamReader(httpConn.getInputStream()));
String line;
while((line = reader.readLine()) !=null)
{
result = result + line+"\n";
}
System.out.println(result);
//关闭IO和连接
reader.close();
httpConn.disconnect();
参考:http://blog.csdn.net/iaiti/article/details/52036947
-------------------------------------------------------------------------------------