IE6的連接數(shù)限制問(wèn)題
先描述一下問(wèn)題:有一個(gè)管理Job的UI,選中一些Job可以Run,每次只能啟動(dòng)一個(gè)。還有一個(gè)UI通過(guò)Timer定時(shí)發(fā)Ajax請(qǐng)求服務(wù)端,查詢并顯示Job的運(yùn)行狀況(進(jìn)度)。
奇怪的問(wèn)題出現(xiàn)了:
1)在FireFox和IE8運(yùn)行正常(貌似正常,稍后再解釋)。其他瀏覽器未測(cè)試。
2)IE6,7及更早版本,Timer無(wú)法檢測(cè)到多于1個(gè)的Job運(yùn)行。
先檢查了一遍代碼,Timer的控制沒(méi)有問(wèn)題。不行就使用Fiddler吧。剛好是IE的問(wèn)題。
觀察HTTP發(fā)現(xiàn)一個(gè)現(xiàn)象,運(yùn)行Job的HTTP似乎沒(méi)有成功,因?yàn)锽ody是-1,之后是每隔一秒的Timer發(fā)起的HTTP。如果再啟動(dòng)一個(gè)Job,發(fā)現(xiàn)Timer停止了!!
等待第一個(gè)Job運(yùn)行成功之后,Timer又恢復(fù)了(重新發(fā)送Ajax請(qǐng)求)!!
似乎是運(yùn)行Job的請(qǐng)求阻塞了(實(shí)際上該請(qǐng)求長(zhǎng)時(shí)間沒(méi)有返回,因?yàn)檫\(yùn)行Job需要幾分鐘甚至更多時(shí)間)。
為啥不使用DWR3.0的Push技術(shù)?后來(lái)跟同事討論明白,這不過(guò)是把Timer從客戶端轉(zhuǎn)移到了服務(wù)端。
記起來(lái)了,俺好像讀DWR源代碼的時(shí)候(當(dāng)時(shí)對(duì)如何實(shí)現(xiàn)推非常感興趣),見(jiàn)過(guò)一段代碼分析Browser的類型和連接數(shù),有的情況還拋出了異常。
明白了,肯定是IE6有連接數(shù)限制問(wèn)題,后來(lái)得知,默認(rèn)情況下,它不支持同時(shí)超過(guò)2個(gè)連接。哈哈。這就對(duì)了。
RunJob占用了一個(gè)(幾分鐘不等),
Timer占用了一個(gè)(很短暫)。
剛好2個(gè)。
- public class BrowserDetect
- {
- /**
- * How many connections can this browser open simultaneously?
- * @param request The request so we can get at the user-agent header
- * @return The number of connections that we think this browser can take
- */
- public static int getConnectionLimit(HttpServletRequest request)
- {
- if (atLeast(request, UserAgent.IE, 8))
- {
- return 6;
- }
- if (atLeast(request, UserAgent.Firefox, 3))
- {
- return 6;
- }
- else if (atLeast(request, UserAgent.AppleWebKit, 8))
- {
- return 4;
- }
- else if (atLeast(request, UserAgent.Opera, 9))
- {
- return 4;
- }
- else
- {
- return 2;
- }
- }
- //....
- }
接下來(lái)就是查資料做試驗(yàn),驗(yàn)證該問(wèn)題是否正確。通過(guò)在注冊(cè)表設(shè)置Internet Settings參數(shù),實(shí)現(xiàn)了更多連接。例如10個(gè)。
但是Job可能很多,不可能無(wú)限制增加連接數(shù),所以RunJob不應(yīng)長(zhǎng)期占用連接,它應(yīng)該把Job插入隊(duì)列并立即返回。
至此問(wèn)題的源頭終于找到了,F(xiàn)iddler又幫了大忙。
讀源代碼是了解技術(shù)運(yùn)作細(xì)節(jié)的最好方法,此外還能學(xué)到好的編程習(xí)慣。
-----------------------------------------------------
Silence, the way to avoid many problems;
Smile, the way to solve many problems;
posted on 2013-05-21 15:19 Chan Chen 閱讀(237) 評(píng)論(0) 編輯 收藏