先看例子吧java
客户端:app
package top.quartz.util; /** * description: //connect timeout 是创建链接的超时时间; * //read timeout,是传递数据的超时时间。 * 这两个值是必须都设置的若是只设置一个那么两种状况发生任意一种就会阻塞住, * 而后当前应用就呈现出假死状态,很严重的一个问题。几乎不少大公司都踩过坑。 * * @author: dawn.he QQ: 905845006 * @email: dawn.he@cloudwise.com * @email: 905845006@qq.com * @date: 2019/9/23 3:22 PM */ import java.io.*; import java.net.*; public class TestUrl { /** * 兼容HTTP和FTP协议 */ public static String getDocumentAt(String urlString) { StringBuffer document = new StringBuffer(); try { URL url = new URL(urlString); URLConnection conn = url.openConnection(); //connect timeout 是创建链接的超时时间; //read timeout,是传递数据的超时时间。 conn.setReadTimeout(10000); conn.setConnectTimeout(10000); System.out.println("获取链接---"); BufferedReader reader = new BufferedReader(new InputStreamReader( conn.getInputStream())); String line = null; while ((line = reader.readLine()) != null) { document.append(line + "/n"); } reader.close(); } catch (MalformedURLException e) { System.out.println("Unable to connect to URL: " + urlString); } catch (IOException e) { System.out.println("IOException when connecting to URL: " + urlString); } return document.toString(); } /** * * @param args */ public static void main(String[] args) { //测试setReadTimeout 传递数据的超时时间 //String documentAt = getDocumentAt("http://localhost:8081/avro/server"); //测试setConnectTimeout 创建链接的超时时间 String documentAt = getDocumentAt("https://www.google.com/search"); System.out.println(documentAt); } }
注释掉jvm
conn.setReadTimeout(10000); 和 documentAt = getDocumentAt("https://www.google.com/search");
模拟连接正常,传递数据超时一直没法响应。函数
注释掉工具
conn.setConnectTimeout(10000); 和 documentAt = getDocumentAt("http://localhost:8081/avro/server");
模拟链接超时一直没法响应。测试
另外一个客户端直接访问谷歌不用启动服务直接访问就好。google
服务端:url
以前写的:http://www.javashuo.com/article/p-kgkiogzr-bq.html 主要就是用到join方法.net
启动类是jar包启动,main函数中注掉了new Ceshi.serverr();code
为了使客户端访问http://localhost:8081/avro/server
注意:访问一次就得把服务端和客户端都停掉在测试。
总结: 这个问题在生产上其实很严重的;因此好好打基础
若是测试出现问题,打开对应的timeout就能超时中断。 不过生产上最好两个都设置上,若是由于这个问题出现生产上的问题就只能经过jvm分析工具,分析很麻烦的。