添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
精彩文章免费看

坑了我几天的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

-------------------------------------------------------------------------------------