版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
文章目录
背景
工作中遇到的一个大BUG,多谢前辈,特此记录。
工作中有心跳相关的功能,用的URLConnection,没有设置conn.setConnectTimeout(1000);
,导致一次心跳超时,就导致这个线程一直卡死在那里,不进行下次重试,影响其他的业务正常进行(心跳成功,才能进行后续的业务)。
解决
如上面的描述,设置conn.setConnectTimeout(1000);
注意:conn.setReadTimeout(1000);
这句话不设置的话是不会影响线程的继续执行的。
实践
特意写了一个小Demo
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
public class TttpTest {
public static void main(String[] args) {
while (true) {
httpPost("https://www.google.com", "a");
System.out.println("success!");
}
}
public static String httpPost(String url, String param) {
String result = null;
PrintWriter out = null;
BufferedReader in = null;
StringBuffer sb = new StringBuffer();
try {
URL realUrl = new URL(url);
URLConnection conn = realUrl.openConnection();
// 添加超时时间
conn.setReadTimeout(1000);
conn.setConnectTimeout(1000);
conn.setDoOutput(true);
conn.setDoInput(true);
out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "utf-8"));
out.print(param);
out.flush();
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
result = sb.toString();
} catch (Exception e) {
e.printStackTrace();
result = null;
} finally {
try {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
return result;
}
}
测试一:注释掉conn.setReadTimeout(1000);
结果如下
还是继续往下执行的
测试二:注释掉conn.setConnectTimeout(1000);
结果如下
卡在这里不动了
测试三:都不注释
结果如下
还是往下继续执行的
结论
以后写URLConnection一定要写conn.setReadTimeout(1000); conn.setConnectTimeout(1000);
,
最起码一定要写conn.setConnectTimeout(1000);
,否则会影响业务功能。