工作填坑记,关于URLConnection的一个大BUG

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dataiyangu/article/details/102562595

背景

工作中遇到的一个大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);,否则会影响业务功能。

猜你喜欢

转载自blog.csdn.net/dataiyangu/article/details/102562595