前段時間做了一個項目,從儀器上采集數據(儀器會源源不斷的發送數據)并將數據push到web browser上,由于要保證能夠離線操作,采用在客戶端電腦上部署一個嵌入小jetty服務器的方案,因此不能夠安裝AMQ來實現push的功能(AMQ太大),同時要保證儀器采集的數據不會丟失,導致不能使用jetty continuations(丟失數據頻繁) 首先來看段js代碼:
此時的常連接實際是個虛假的長連接,是以反復的與servlet建立連接并讀取數據而實現的。而這種方式,當servlet端正源源不斷的往browser段傳輸數據時,browser會有一部分時間消耗在建立連接、處理數據、關閉連接的過程中,因此導致servlet傳輸的數據會丟失. 因此做了一個Comet Queue組件,能夠實現以下目標: 1. 代碼少,建立在spring上 2. 對于每個http session創建一個獨立的session, 這些session有自己的生命管理周期,當長時間沒有服務請求這些session時,會自動被注銷. 3. 數據產生者發送數據給訂閱者,保證每個請求都能拿到自己會話中的數據,而不會丟失。 這樣一個小功能,適合在對comet傳輸的數據要求準確性較高的要求中使用,他可以針對每一個http session創建一個session,將session保存在池中。一方面,數據產生者產生數據時,往池中的每個session添加數據;另一方面,數據消費者從自己的session中取出數據。這樣就保證了數據不會丟失。 架構藍圖如下圖所示:
Copyright @ Danfo Yam Powered by: .Text and ASP.NET Theme by: .NET Monster