2010-12-01 86 views
2

我也在Spring論壇posted this,但想我會在這裏給出鄉親加入到他們的聲譽了一槍:對會話作用域bean的Spring內置複製支持?

對於在集羣環境中(會話複製/故障切換)運行老式的servlet的應用程序,它是好的做法是「重新設置」會話屬性,如果他們已經被修改:

UserPreferences prefs = (UserPreferences)session.getAttribute("userPreferences"); 
prefs.setInstantEmail(true); 
session.setAttribute("userPreferences", prefs); 

這作爲一個標誌,會話狀態已經改變,需要複製的容器。 Here's a reference有關這個主題的一些WLS文檔。

我目前正在修改的應用程序使用Spring來支持POJO +注入開發風格,我不清楚上述做法是如何轉換的。根據Spring文檔,Scoped beans as dependencies,該應用使用<aop:scoped-proxy/>來注入會話作用域依賴項。但是,如果不直接訪問會話,那麼對該容器標記的依賴性的更改如何進行,以便可以進行復制?是否有內置於代理或Web上下文的內容來支持它?如果沒有,有沒有人有他們如何處理它的例子?

感謝您的任何見解。

澄清基於axtavt's answer

一個在下面一個POJO +注射方法項目的目標是避免在任的Java EE還是Spring類的直接依賴。我可以想象,Spring可能會暴露一些鉤子,從上下文中檢索bean,這可以提供一個位置來至少跟蹤哪些會話範圍的bean已被使用。另一種可能性可能是在會話範圍的bean上聲明一組方法,這些方法在被調用時可能觸發狀態更改。不熟悉春天,我只能猜測什麼似乎可能不知道技術細節。

後續尋找一些春天代碼之後的問題:

任何人都可以擺脫對ServletRequestAttributes可能扮演的角色一些輕?它看起來像它的getAttribute方法跟蹤哪些屬性已被檢索,然後它的updateAccessedSessionAttributes方法試圖「重新設置」它認爲已經改變的屬性。

回答

0

事實證明,我能夠跟來自SpringSource支持的人誰證實ServletRequestAttributes負責的實體:

從看代碼,你可以按如下做手工做「重新設置」。

0

哪裏沒有內置的支持。

RequestAttributes a = RequestContextHolder.currentRequestAttributes(); 
String name = ScopedProxyUtils.getTargetBeanName("...your bean name...") 
synchronized (a.getSessionMutex()) { 
    Object o = a.getAttribute(name, RequestAttributes.SCOPE_SESSION); 
    a.setAttribute(name, o, RequestAttributes.SCOPE_SESSION); 
} 
+0

感謝您花時間回覆我已根據您的回答添加了一些其他信息。 – kschneid 2010-12-01 22:46:52

相關問題