Chan Chen Coding...

          IE6的連接數限制問題

          先描述一下問題: 
          有一個管理Job的UI,選中一些Job可以Run,每次只能啟動一個。還有一個UI通過Timer定時發Ajax請求服務端,查詢并顯示Job的運行狀況(進度)。 

          奇怪的問題出現了: 
          1)在FireFox和IE8運行正常(貌似正常,稍后再解釋)。其他瀏覽器未測試。 
          2)IE6,7及更早版本,Timer無法檢測到多于1個的Job運行。 

          先檢查了一遍代碼,Timer的控制沒有問題。不行就使用Fiddler吧。剛好是IE的問題。 

          觀察HTTP發現一個現象,運行Job的HTTP似乎沒有成功,因為Body是-1,之后是每隔一秒的Timer發起的HTTP。如果再啟動一個Job,發現Timer停止了!! 

          等待第一個Job運行成功之后,Timer又恢復了(重新發送Ajax請求)!! 

          似乎是運行Job的請求阻塞了(實際上該請求長時間沒有返回,因為運行Job需要幾分鐘甚至更多時間)。 

          為啥不使用DWR3.0的Push技術?后來跟同事討論明白,這不過是把Timer從客戶端轉移到了服務端。 

          記起來了,俺好像讀DWR源代碼的時候(當時對如何實現推非常感興趣),見過一段代碼分析Browser的類型和連接數,有的情況還拋出了異常。 

          明白了,肯定是IE6有連接數限制問題,后來得知,默認情況下,它不支持同時超過2個連接。哈哈。這就對了。 

          RunJob占用了一個(幾分鐘不等), 
          Timer占用了一個(很短暫)。 

          剛好2個。 
          Java代碼  收藏代碼
          1. public class BrowserDetect  
          2. {  
          3.     /** 
          4.      * How many connections can this browser open simultaneously? 
          5.      * @param request The request so we can get at the user-agent header 
          6.      * @return The number of connections that we think this browser can take 
          7.      */  
          8.     public static int getConnectionLimit(HttpServletRequest request)  
          9.     {  
          10.         if (atLeast(request, UserAgent.IE, 8))  
          11.         {  
          12.             return 6;  
          13.         }  
          14.         if (atLeast(request, UserAgent.Firefox, 3))  
          15.         {  
          16.             return 6;  
          17.         }  
          18.         else if (atLeast(request, UserAgent.AppleWebKit, 8))  
          19.         {  
          20.             return 4;  
          21.         }  
          22.         else if (atLeast(request, UserAgent.Opera, 9))  
          23.         {  
          24.             return 4;  
          25.         }  
          26.         else  
          27.         {  
          28.             return 2;  
          29.         }  
          30.     }  
          31. //....  
          32. }  


          接下來就是查資料做試驗,驗證該問題是否正確。通過在注冊表設置Internet Settings參數,實現了更多連接。例如10個。 

          但是Job可能很多,不可能無限制增加連接數,所以RunJob不應長期占用連接,它應該把Job插入隊列并立即返回。 

          至此問題的源頭終于找到了,Fiddler又幫了大忙。 

          讀源代碼是了解技術運作細節的最好方法,此外還能學到好的編程習慣。

          -----------------------------------------------------
          Silence, the way to avoid many problems;
          Smile, the way to solve many problems;

          posted on 2013-05-21 15:19 Chan Chen 閱讀(240) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 新宁县| 富顺县| 沧州市| 西宁市| 黔南| 名山县| 手机| 砚山县| 五峰| 兴文县| 宁化县| 成都市| 建始县| 新密市| 靖边县| 苍山县| 平乡县| 玉溪市| 锡林浩特市| 河北省| 张家港市| 加查县| 磐石市| 桦甸市| 如皋市| 长垣县| 兰州市| 阿克陶县| 海兴县| 新绛县| 玛沁县| 浦北县| 巧家县| 溆浦县| 邹城市| 武强县| 华池县| 菏泽市| 饶阳县| 贵定县| 庆云县|