3
我們有一個webapp應用場景,作爲一個OSGi
捆綁包。我們希望執行捆綁更新以將錯誤修正等透明地部署到正在運行的系統中。假設刷新和軟件包重新啓動的更新週期,當重新加載類的對象已存儲在導致ClassCastException
的HttpSession
上時,這會導致問題。如何處理有狀態的OSGi服務以跨包更新維護會話狀態?
我們正在尋找幾種不同的方法來使捆綁更新成爲可能,而不會在登錄的會話中丟失狀態。爲了簡化我們正在考慮設置以下限制會話狀態的訪問依賴關係圖:
- 捆綁只能訪問自己的會話狀態,即由另一捆設置狀態不能直接訪問(力量,改爲調用包API以間接訪問其狀態)
- 添加到會話狀態的對象的Java類應該來自包本身(以避免我們的會話狀態受其他包的更新影響,而不是我們自己) 這些限制實際上只是一些下面的替代方案。
所以,這些都是最大的寓意訂單,我們已經提出了替代方案在某種至少:
- 存儲所有狀態
java.*
類型(String
,List
等)
- >狀態類永遠不會重新加載。 - 鎖定會話將其狀態與創建的服務版本(通過使用proxying solutions˚F前即着該屆會議之前使用的版本)
- >新會話將搭載更新包的版本,而現有的會議將留在舊版本。 - 序列化更新捆綁包時的會話狀態並將其反序列化爲新捆綁版本(如應用服務器會話序列化,但粒度更細)
- >所有會話都會提取更新的捆綁包,但要求序列化狀態是兼容的。 - 只要有活動的會話,避免更新有狀態的服務,利用傳統的負載平衡器技術一次更新一個應用服務器
- >更長的部署週轉時間,可能需要更多的資源。 - 完全避免狀態
OSGi
服務,並保持狀態別處
- >不處理在OSGi
問題...
我錯過任何有趣的選擇?
你推薦什麼解決方案?
[雖然這篇文章明確地談到了同樣的討論也適用於其他領域,如通話狀態,應用程序狀態等會話狀態]
如何將會話中存儲的實際對象保存在自己的包中?這不會避免類拋出異常嗎? – ilikeorangutans 2013-05-06 17:55:05
是的,我正在考慮增加一個單獨的選擇,但我沒有,因爲我們仍然回到其他選擇,如果那些與「國家班」的捆綁更新。 – mikewse 2013-05-06 22:07:57