2011-09-07 27 views
1

考慮到開發Java EE應用程序的事實,它具有聊天服務器的目的,我遇到了一些問題。如何維護有狀態會話Bean的列表?

客戶端應該能夠使用HTTP,SOAP或AMF等不同的連接器進行連接。傳入的請求需要轉換爲統一的內部消息。接下來,消息驅動的bean調用業務邏輯並將請求的結果返回給特定的連接器。

問題1:這聽起來合理嗎?

我的問題是我如何存儲每個客戶端的會話信息。這將包括連接數據,時間戳,需要交付的命令等。 有狀態會話Bean應該沒問題,因爲只要客戶端連接,我就需要它們。但是,問題是要維護所有bean的列表,以便能夠爲新請求選擇正確的會話。 我無法將SFSB引用鏈接到HttpSession(如其他地方推薦的),因爲存在不同的連接器,不僅僅是HTTP客戶端。

問題2:那是什麼方法?會話管理器,執行JNDI查找以創建新的SFSB並將其添加到內部列表中?

問題3:它如何在集羣環境中工作?我看到SFSB可以複製到不同的節點,但是如何同步會話管理器列表?

問題4:除了負載平衡器之外,您還會推薦會話親和度嗎?

謝謝。

回答

1

Q1:我想。這取決於你的要求。只是不要過分複雜的東西。簡單點吧。並且請注意,使用諸如消息驅動Bean之類的東西意味着異步處理/響應以及消息失敗或進入系統異常/死信隊列的機會。 Q2:通常你想通過JNDI查找Java EE bean。 IMO讓生活更輕鬆。也許你需要一個servlet或一個無狀態會話bean或者作爲一個「控制器」在前面?然後,當需要數據和/或在不再需要bean時將數據寫入數據庫時​​,可以從數據庫加載有狀態bean的數據。

問題3:取決於您如何配置羣集以及您正在使用的應用程序服務器。每個服務器都可能有不同的集羣/故障切換/同步等。我建議您閱讀應用程序服務器文檔以找出答案。和/或發佈您正在使用的應用程序服務器,以便此論壇上的其他人可以推薦一些內容。例如,我們使用IBM WebSphere Application Server,版本7.0.0.7,Network Deployment Edition。所以在我們的例子中,我們可以在集羣節點之間設置bean /對象的複製。

問題4:如果您希望爲最終用戶的每個後續事務保持連接到同一羣集節點,我相信答案是肯定的。 (至少從進入HTTP服務器的角度來看)。我猜如果你沒有打開會話相關性,那麼你可以切換到不同的羣集節點,並且找到你的數據可能會更加棘手(特別是如果你不在羣集之間複製它)。它可以完成,它可能只是一個性能問題。所以我猜這裏的答案是「是」。

+0

我使用GlassFish 3.1.1。其實,主要問題是我如何獲得對SFSB實例的引用?查看後,我需要存儲它?有沒有辦法從應用程序服務器檢索所有實例,並使用諸如「connectionID」之類的標識符選擇相應的實例? – valentin

+0

我的理解是,您只是使用查詢來請求數據,通常JPA和應用程序服務器會負責從數據庫加載對象並將它們返回給您。 –

+0

非常感謝! 因此,存儲會話信息(即使會有很多更新)應該通過JPA層到數據庫?當然,這會讓我們有機會在所有集羣節點上獲得相同的信息,但是不是使用數據庫作爲接口來連接所有節點的性能缺陷? – valentin

1

關於你的問題:

Q3:如何將它在集羣環境中工作?我看到SFSB可以將 複製到不同的節點,但是如何同步會話管理器 列表?

我通過序列化/反序列化句柄來存儲對有狀態會話Bean(SFSB)的引用。它在羣集環境中運行良好,但是當羣集中的節點在之間之間啓動/停止時,SFSB調用會在調用後進行修改。並且一旦在SFSB調用之後Handle被修改,那麼它需要被再次序列化爲以供進一步使用。

我想你可能會考慮我的序列化/反序列化SFSB句柄的方法。