先看例子吧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分析工具,分析很麻煩的。