精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java中HttpURLConnection 與 PoLA 法則

開發 后端
如果你也是開發者的話,你很可能已經知道PoLA法則(Principle of Lease Astonishment)。那么,看看這篇文章講述的充滿奇幻色彩的調試經歷,來見識一下PoLA是如何與HttpURLConnection發生了關聯。

如果你和我一樣也是開發者的話,你很可能已經聽說過“PoLA”原則,或者叫作“產生最少意外”原則。意思非常簡單,就是不要讓你的用戶感到驚訝。 或者更明確一些,就像本文這種情況,不要讓另外一個開發者感到驚訝。不幸的是,我上個星期就遇到了大大超出我意外的事情,我們有個服務的客戶調用端總是發 出一些垃圾的請求。

你說垃圾請求嗎?是的,就像這樣,我們完全不清楚這些請求是從哪里來的。又是這樣一個時刻,經理們毫無頭緒,抱頭亂竄,驚呼“我們肯定是被黑客攻擊了”,或者 ”有人把防火墻給關掉了!!”

無論如何,先說點背景情況吧,我們的項目里有自動記錄活動日志的功能,當某些情況下,比如一個進程啟動的時候就會進行記錄。這包括我們那出問題的網 絡服務客戶端和服務端,因為它們兩者都屬于系統的一部分。在某些時候,我們注意到,服務端的響應還沒有發出的時候,另外一個來自同樣客戶端的請求又發了過 來。這個真是出乎意料的,因為客戶端代碼是單線程的,也沒有其他的客戶端摻和進來。審查代碼、測試之后,結論是我們的客戶端不可能在第一個請求還沒結束的 時候再同時發出另外一個。

經過一整天的調試和研究日志發現,事實上,在服務端處理還未結束的時候客戶端其實已經斷開連接了。所以,這些請求終究并不是同時發生的,但是為什么我們花了一整天的時間才發現呢?這跟我們玩了一整天的星球大戰有啥區別?

好吧,其實也不是。我們發現了罪魁禍首,服務端的容器軟件HTTP的讀超時設置被調得太低了。服務端的日志顯示的確生成了響應,但是客戶端卻在此之 前已經斷開了,因為服務器端發生了讀超時。這些在服務器端當然沒有日志記錄,因為這種行為是更低一層協議決定的(HTTP棧),而不是服務端的應用代碼。

是的,沒錯,我聽明白了,但是客戶端的日志該怎么解釋?客戶端是不是應該拋出一個“ReadTimeoutException”異常,或者類似的玩 意,然后可以寫到日志里?然而,沒錯,事實上,并沒有。就像現在發現的一樣,真正的意外來自HttpURLConnection類的內部(更確切地說,是 默認的Oracle的官方實現sun.net.www.protocol.http.HttpURLConnection)。

你以前是否知道HttpURLConnection的默認實現有個在某些情形下自動重試的特性?好吧,我之前就不知道。當時的情況是,客戶端的確觸 發了超時異常,但是卻被HttpURLConnection給捕捉了,而它自己決定重新嘗試一次。這就意味著,你調用了 HttpURLConnection的read()方法,它阻塞了,你正在等待,看起來就好像是在等待第一次請求的響應一樣。但是在 HttpURLConnection內部,它作了不止一次嘗試,因此創建了不止一個socket連接。這就解釋了為什么第二次及以后的請求永遠在日志里找 不到,因為這些第二次之后的請求是HttpURLConnection內部發起的。

讓我們上一些代碼重現一下。

import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.concurrent.Executors;
import com.sun.net.httpserver.HttpServer;
/**
 * Created by koen on 30/01/16.
 */
public class TestMe {
 public static void main(String[] args) throws Exception {
  startHttpd();
  HttpURLConnection httpURLConnection = (HttpURLConnection) new URL("http://localhost:8080/").openConnection();
  if (!(httpURLConnection instanceof sun.net.www.protocol.http.HttpURLConnection)) {
   throw new IllegalStateException("Well it should really be sun.net.www.protocol.http.HttpURLConnection. "
     + "Check if no library registered it's impl using URL.setURLStreamHandlerFactory()");
  }
  httpURLConnection.setRequestMethod("POST");
  httpURLConnection.connect();
  System.out.println("Reading from stream...");
  httpURLConnection.getInputStream().read();
  System.out.println("Done");
 }
 public static void startHttpd() throws Exception {
  InetSocketAddress addr = new InetSocketAddress(8080);
  HttpServer server = HttpServer.create(addr, 0);
  server.createContext("/", httpExchange -> {
   System.out.println("------> Httpd got request. Request method was:" + httpExchange.getRequestMethod() + " Throwing timeout exception");
   if (true) {
    throw new SocketTimeoutException();
   }
  });
  server.setExecutor(Executors.newCachedThreadPool());
  server.start();
  System.out.println("Open for business.");
 }
}

運行之,將會得到類似下面的輸出。

Open for business.
Reading from stream...
------> Httpd got request. Request method was:POST Throwing timeout exception
------> Httpd got request. Request method was:POST Throwing timeout exception
Exception in thread "main" java.net.SocketException: Unexpected end of file from server
 at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:792)
 ...

注意,我們的監聽服務被調用了兩次,但是我們只發了一個請求。如果我們加上-Dsun.net.http.retryPost=false這個屬性再運行一次的話,我們會得到下面的輸出:

------> Httpd got request. Request method was:POST Throwing timeout exception
Exception in thread "main" java.net.SocketException: Unexpected end of file from server
 at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:792)
 ...

好,先把這事放一邊,我想問的是,到底是誰搞出這么個設計來,既沒文檔描述又沒有可配置選項?為啥我做了十五年的Java開發,卻對此一無所知?更要命的是,為什么它要對一個構造異常的POST請求進行重試呢?這是對PoLA赤裸裸的違背!

現在你可能已經猜到了,這是一個BUG(鏈接:http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6382788)。 當然了,說是BUG并不是指的它的重試機制,而是指它為什么對異常POST請求也會進行重試。按照HTTP RFC的規范,POST請求并非冪等,因此多次提交POST會帶來服務器端數據的改變。但是別擔心,Bill早就把這個BUG修改好了。Bill的解決方 法是加了一個開關。Bill了解向后兼容原則。Bill認為最好的方法是添加一個默認開啟的開關,這樣可以保證這個BUG的向后兼容。Bill笑了。 Bill已經能夠看見全球無數的Java開發者掉進這個大坑時驚愕的面孔。但是,你們都別學Bill好嗎?

經過好幾天激動人心的調試,最后問題解決的方式卻略顯輕巧,僅僅指定了一個屬性就搞定了。無論如何,這個設計真是著實讓我很意外,因此我還專門寫了這篇文章來講述,并且,你也看到了這篇文章。

為了完整起見,再提醒一下,如果你讓這段代碼在容器環境里執行的話,結果可能會不同。你的容器或者你的代碼所依賴的庫有可能會替換掉Oracle默 認的內部實現,請參考URL.setURLStreamHandlerFactory()。現在你可能會問,那個家伙當時為什么要使用 HttpURLConnection呢?他難道是坐著演講巡游車上班嗎(原文Wooden Soapbox,由來參見https://en.wikipedia.org/wiki/Soapbox)?他難道是用剪子來割草嗎?建議他傳遞信息的時 候最好還是使用烽火吧!當然了,你這么想我也不能責怪你。我們出問題的代碼有點特別,使用的是SAAJ中的SOAPConnectionFactory, 而SOAPConnectionFactory內部又默認使用了HttpURLConnection,如果沒有其他代碼來注冊其他的實現類的話,使用的當 然就是默認的Oracle實現嘍~

如果你使用其他更專業的web服務實現的時候(如Spring WS, CXF, JAX-WS實現等等),他們很可能使用了諸如Apache HTTP Client的組件。當然了,如果你自己的代碼需要發起HTTP連接的話,你也可以使用它。沒錯,我還是推薦你使用Apache Commons HttpClient,雖然這貨修改API的頻率比普通時尚達人換鞋的頻率都還要高。好了,我的牢騷完了。

譯文鏈接:http://www.codeceo.com/article/java-httpurlconnection-pola.html
英文原文:HttpURLConnection vs. the Principle of Least Astonishment

責任編輯:王雪燕 來源: 碼農網
相關推薦

2014-08-13 10:20:59

HttpURLConn

2014-08-15 13:11:03

HttpURLConn

2016-12-15 08:28:34

HttpURLConn上傳文件

2024-05-09 08:30:57

OkHttpHTTP客戶端

2016-02-15 09:49:21

2010-01-25 11:09:58

Android Htt

2025-05-22 08:25:00

C++開發資源管理

2025-05-07 03:00:00

數據中臺大數據

2019-09-09 15:28:04

數據科學帕累托法則工具

2015-04-14 11:01:08

大數據速度與激情用車法則

2011-05-06 10:49:13

網頁設計

2015-10-13 09:37:37

開源法則

2010-05-11 10:27:49

企業培訓

2012-07-24 12:47:37

軟件設計架構設計

2012-04-25 23:53:08

APP

2025-04-27 08:23:38

Kotlin協程管理

2024-05-23 10:58:49

2025-08-28 02:12:00

2010-01-26 10:02:51

Android But

2010-10-26 12:30:21

網絡管理
點贊
收藏

51CTO技術棧公眾號

日韩国产一区| 1024在线播放| 亚洲91中文字幕无线码三区| 精品欧美一区二区三区| 成人午夜小视频| 亚洲欧美一区二区三区不卡| 九色在线视频蝌蚪| 国产精品v一区二区三区| 欧美性猛交xxxx乱大交退制版| 国产精品久久久一区二区三区| 农村老熟妇乱子伦视频| 亚洲优女在线| 丁香亚洲综合激情啪啪综合| 久久91精品国产91久久跳| 色乱码一区二区三区在线| 欧美777四色影视在线| 亚洲人成在线影院| 日韩精品一区在线观看| 一级全黄肉体裸体全过程| 91青青草视频| 爱情电影网av一区二区| 国产精品美女久久久久av爽李琼| 国产成人啪精品视频免费网| 亚洲欧美色图视频| 日韩精品美女| 久久老女人爱爱| 欧美亚洲日本网站| 少妇大叫太粗太大爽一区二区| 嗯啊主人调教在线播放视频 | 2020国产精品极品色在线观看| 中文字幕制服丝袜成人av| 国产精品欧美日韩久久| 欧美一区二区三区观看| 日日狠狠久久| 中文在线一区二区| 成人国产精品av| 国产一区二区播放| 999精品视频在这里| 亚洲午夜久久久久久久久久久| 成人羞羞视频免费| 国产亚洲精品码| 欧美久久精品| 色悠悠久久综合| 日韩一区免费观看| 国产精品自产拍| 国模吧视频一区| 亚洲精品短视频| 嫩草av久久伊人妇女超级a| 在线观看免费黄色| 国内精品在线播放| 午夜精品久久久久久久99热 | 中文字幕在线观看精品| 欧美高清视频手机在在线| 欧美精品日韩精品| 日本中文不卡| 亚洲av无码一区二区三区性色| 亚洲成人在线| 中文字幕精品网| 手机看片国产精品| 成人勉费视频| 亚洲欧美日韩国产综合| 国产美女精品久久久| 中文字幕在线观看视频免费| 99视频精品全国免费| 亚洲国产精品高清久久久| 国产精品人人妻人人爽人人牛| 精品自拍一区| 久久久久久久精| 91传媒免费看| 国产主播第一页| 国产精品theporn| 亚洲国产小视频在线观看| 成人一区二区三| 日本精品600av| 欧美国产精品中文字幕| 国产日韩欧美综合精品| 国产精品熟女久久久久久| 一本色道88久久加勒比精品| 久久精品成人欧美大片| 欧美性xxxx图片| 麻豆国产一区二区三区四区| 在线日韩av片| 日韩免费一级视频| 日本高清在线观看| 国产精品国产三级国产aⅴ中文| 国产精品乱码视频| 国产精品国产三级国产普通话对白| 男女av一区三区二区色多| 欧美高清激情视频| www.99re6| 国产欧美日韩精品高清二区综合区| 欧美va日韩va| 91aaa精品| 国产成人a视频高清在线观看| 第一福利永久视频精品| 亚洲爆乳无码精品aaa片蜜桃| 1024国产在线| 国产欧美一区视频| 欧美久久在线| 日本中文字幕一区二区有码在线| 成人禁用看黄a在线| 99re在线观看| 亚洲成人一级片| 国产福利电影一区二区三区| 国产自产女人91一区在线观看| 国产成人精品777777| 国产日韩1区| 午夜欧美不卡精品aaaaa| 国产一级免费av| 欧美特黄一区| 欧美另类第一页| 天天操天天操天天操天天操天天操| 日韩精品免费一区二区三区| 最近中文字幕日韩精品 | www.xxx国产| 国产一区二区三区蝌蚪| 成人网页在线免费观看| 国产精品一区二区av白丝下载| 美女在线观看视频一区二区| 国产精品一区二区久久国产| 中文无码av一区二区三区| 日韩高清不卡一区二区三区| 国产成人精品电影| 在线观看国产一区二区三区| 蜜臀av一区二区在线观看| 国产日韩欧美在线观看| a视频免费在线观看| 国产成人8x视频一区二区| 国产在线精品一区二区三区》| 神马久久高清| 国产日韩av一区二区| 亚洲精品中字| 色女人在线视频| 亚洲成人你懂的| 欧美黄网站在线观看| 久久天堂av| 91麻豆精品国产91久久久久久久久| 宇都宫紫苑在线播放| 操欧美女人视频| 亚洲精品一区久久久久久| 中文字幕av久久爽一区| 综合激情视频| 欧美一级淫片丝袜脚交| 一区二区三区在线免费观看视频| 国产精品夜夜嗨| 精品国产乱码久久久久软件 | 精品视频在线观看网站| 日韩欧美国产一区在线观看| 漂亮人妻被黑人久久精品| 精品国产乱码久久久久久蜜坠欲下| 在线精品播放av| 欧美精品一区二区成人| 羞羞视频在线观看欧美| 91在线色戒在线| 四虎精品成人影院观看地址| 国产精品美女久久久久久久久久久 | 国内精品久久久久久影视8| 亚洲天堂视频网站| 国产专区欧美精品| 久久久久一区二区| 国产在线观看91| 色婷婷精品大在线视频| 日韩精品在线播放视频| 九九久久婷婷| 欧美精品成人在线| 亚洲午夜激情视频| 99久久综合精品| 一本二本三本亚洲码 | 久久性感美女视频| 97人人爽人人喊人人模波多| 在线免费观看视频网站| 99久久久免费精品国产一区二区| 一区二区不卡在线观看| 天堂电影一区| 日韩精品一区二区三区在线播放 | 福利视频999| 西野翔中文久久精品国产| 久久91亚洲精品中文字幕| 制服丝袜在线一区| 91色.com| 水蜜桃色314在线观看| av在线精品| 夜夜嗨av一区二区三区免费区 | 欧美性一二三区| 在线天堂www在线国语对白| 91精品国产乱码久久久久久| 国产精品久久久久久久久久免费 | 成人h动漫精品一区二区| 中文字幕一区综合| 日韩成人高清| 亚洲视频一区二区| 日韩熟女精品一区二区三区| 国产精品夜夜嗨| 艳母动漫在线免费观看| 日本中文字幕视频一区| 在线看日韩av| 97人妻一区二区精品视频| gogo大胆日本视频一区| 轻点好疼好大好爽视频| 欧美午夜在线播放| 久久中文字幕国产| 99精品在线看| 亚洲男人的天堂在线观看| 在线观看日本一区二区| 成人精品久久| 国产精品日韩欧美大师| av天在线观看| 欧美日韩亚洲国产综合| 国产白丝一区二区三区| 蜜桃视频一区二区| 亚洲欧美日韩在线综合| 国产精品第一国产精品| www国产亚洲精品久久网站| 91精品国自产| 亚洲人成网站色在线观看| 日韩高清在线一区二区| 自由日本语亚洲人高潮| 国产98在线|日韩| av影视在线看| 日韩精品日韩在线观看| 91精品国产高清一区二区三密臀| 久久综合九色综合久久久精品综合 | 色婷婷综合五月| 久久丫精品忘忧草西安产品| 青青草国产精品97视觉盛宴| 亚洲一区二区三区涩| 日韩福利影视| 九色精品免费永久在线| 午夜视频福利在线| 在线观看免费一区| 免费成人深夜夜行网站| 国产成人午夜精品影院观看视频| 国产高清www| 亚洲三级性片| 国产在线视频不卡| 丰满大乳少妇在线观看网站| 亚洲国产97在线精品一区| 麻豆成人免费视频| 中文字幕亚洲欧美在线不卡| 欧美一级大片免费看| 国产精品色网| 成人手机视频在线| 卡通动漫国产精品| 国产精品人成电影| 国产盗摄在线视频网站| 亚洲欧美成人在线| 99热这里只有精品在线观看| 午夜精品久久久久久久| 99久久99久久精品免费看小说.| 国产老妇另类xxxxx| 国产成人亚洲精品无码h在线| 成人在线一区| 国产乱人伦精品一区二区| 韩日精品一区| 久久久这里只有精品视频| 国产大片在线免费观看| 精品欧美乱码久久久久久| 天天干,天天干| 亚洲一区在线免费观看| 国产探花视频在线播放| 成人精品在线视频观看| 手机在线看福利| 亚洲欧洲日本mm| 一级黄色录像免费看| 欧美人与牛zoz0性行为| 97久久精品午夜一区二区| 成人不卡视频| 91chinesevideo永久地址| 麻豆视频在线| 亚洲国产精品字幕| 国产农村妇女毛片精品久久| 一本到三区不卡视频| 国产午夜精品无码| 亚洲日本护士毛茸茸| 国产毛片久久久久久久| av在线综合网| 国产人妖在线观看| 激情综合色播激情啊| 欧美激情国产精品日韩| 国产精品99一区二区| 正在播放一区二区三区| 精品久久美女| 玛丽玛丽电影原版免费观看1977 | 新版中文在线官网| 日日噜噜噜夜夜爽亚洲精品| 蜜桃视频在线播放| 日韩精品视频在线播放| 欧美视频久久久| 日韩一区二区电影在线| 国产女人高潮时对白| 欧美视频一区二区三区四区| 91丝袜一区二区三区| 精品久久久久久久中文字幕| 久久久久久久久久久网| 亚洲免费伊人电影| 国产福利视频网站| 中文字幕一区二区日韩精品绯色| 人妻aⅴ无码一区二区三区| 91天堂素人约啪| v8888av| 国产亚洲欧洲997久久综合| 中文字幕国产综合| 久久久久九九视频| 人妻少妇无码精品视频区| 久久久不卡网国产精品二区| 新91视频在线观看| 久久久久成人黄色影片| 91久久免费视频| 国产亚洲人成网站| 99自拍偷拍视频| 国产精品成人免费精品自在线观看| 国产又粗又黄又猛| 国产精品毛片无遮挡高清| 日本一级特级毛片视频| 亚洲精品国产品国语在线app| 欧美国产日韩在线观看成人| 一区二区三区在线免费观看| 欧美日韩大片在线观看| 亚洲国产日产av| 日本五十路女优| 一本大道综合伊人精品热热| 国产美女www| 91麻豆精品国产无毒不卡在线观看| 国产黄色片网站| 亚洲黄页网在线观看| 日韩porn| 中文字幕日韩在线播放| 麻豆av在线导航| 精品少妇一区二区30p| 国产一二在线播放| 国产精品视频自拍| 亚洲超碰在线观看| 精品一区在线播放| 国产欧美日韩精品一区二区免费 | 亚洲综合第一页| julia中文字幕一区二区99在线| 国产精品一区二区三区在线观| 日日狠狠久久偷偷综合色| 天天爽天天狠久久久| 欧美一区影院| 国产成人a亚洲精v品无码| 麻豆成人久久精品二区三区小说| 香蕉视频xxxx| 久久久久久电影| 男人操女人的视频网站| 欧美日韩亚洲91| 99精品免费观看| 亚洲欧洲日产国产网站| 老司机福利在线视频| 欧美一区深夜视频| 成人日韩视频| 久久偷看各类wc女厕嘘嘘偷窃| 午夜免费一区| 免费高清在线观看免费| 国产乱理伦片在线观看夜一区| 亚洲乱码国产乱码精品精大量| 国产精品初高中害羞小美女文| www.国产高清| 日韩欧美一二区| 国产永久免费高清在线观看视频| 美日韩精品免费视频| 欧美日韩免费看片| 国产日韩欧美亚洲一区| 99久久夜色精品国产亚洲96 | 手机在线免费看片| 欧美色视频日本高清在线观看| 国产女人高潮毛片| 一区二区中文字幕| 国产乱码精品一区二三赶尸艳谈| 国产精品偷伦免费视频观看的| 加勒比色老久久爱综合网| 做爰高潮hd色即是空| 日本亚洲视频在线| 亚洲一区二区三区综合| 一区二区三区在线观看欧美| 国产美女www爽爽爽| 亚洲精品中文字| a'aaa级片在线观看| 91天堂在线观看| 成人系列视频| 黄色高清无遮挡| 91丝袜美腿高跟国产极品老师| 国产在线拍揄自揄拍无码视频| 51精品视频一区二区三区| 国产视频网址在线| 青青久久aⅴ北条麻妃| 国产伦精品一区二区三区免费优势| 国产成年人在线观看| 久草在线在线精品观看| 亚洲色图第四色| 欧美中文字幕一二三区视频| 亚洲人视频在线观看| 久久久亚洲国产| 国产激情综合| 国产av第一区| 国产在线乱码一区二区三区| www.涩涩爱| 欧美日本在线播放| 一本一道波多野毛片中文在线| 国产精品普通话|