Chan Chen Coding...

          IE6的連接數(shù)限制問題

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

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

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

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

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

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

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

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

          明白了,肯定是IE6有連接數(shù)限制問題,后來得知,默認情況下,它不支持同時超過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參數(shù),實現(xiàn)了更多連接。例如10個。 

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

          至此問題的源頭終于找到了,F(xiàn)iddler又幫了大忙。 

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

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

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


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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 兴文县| 元氏县| 宁安市| 太保市| 出国| 隆德县| 垦利县| 无极县| 高安市| 广汉市| 南华县| 林西县| 彭泽县| 泰安市| 自贡市| 湛江市| 老河口市| 昌平区| 鹤峰县| 临沂市| 阳泉市| 专栏| 城固县| 辉县市| 新巴尔虎右旗| 海门市| 藁城市| 宜昌市| 延吉市| 阳原县| 光山县| 宁夏| 宜君县| 崇明县| 和硕县| 漯河市| 石首市| 彭州市| 班玛县| 视频| 太原市|