2010-01-19 67 views

回答

1

這不是要在代碼級別解決的問題,而是在Web服務器級別解決。所以Servlet代碼不需要知道被聚集。

0

正如@BalusC所說,這主要是一個服務器配置任務,如何做到這一點很大程度上取決於您正在使用哪個服務器(以及您沒有提及的服務器),但這裏是例如how to do it with Tomcat 6

在代碼方面有一點要記住,那就是你必須小心你把什麼對象放入HTTP會話中(使用HttpSession.setAttribute()。要使會話複製起作用,這些對象必須是爲了序列化通過網絡到集羣中的其他服務器進行運輸。如果他們序列化的,那麼無論是服務器可以刪除它們,或者它可能會拋出異常。

的情況並不少見開發人員使用HTTP會話作爲放置大型複雜業務對象(例如,允許從JSP訪問它們)的地方,這些東西不太可能是可序列化的。表單綁定對象的其他示例,雖然是簡單的表單數據持有者,但往往不可序列化。

1

代碼不需要知道被羣集,但開發人員需要知道代碼可能被羣集並且會話被複制。讓我解釋。

當您在web.xml中標記web應用程序時,您告訴容器此web應用程序可以被羣集。

如果Web應用程序部署在羣集上,則羣集中的每臺計算機都將運行一個虛擬機並在其中放置此webapp。至於客戶端所關心的請求,它會看到一個Web應用程序,儘管來自客戶端的每個請求都可以由集羣中不同的虛擬服務器提供服務。

因此,如果Web應用程序正在存儲任何狀態,則必須使其可用於運行Web應用程序的vms(在集羣中)的所有實例。 這怎麼辦? 通過將您放入httpsession對象的內容標記爲「可序列化」。您正在向容器發信號通知它應該將狀態複製到其他虛擬機(如果您已設置會話複製)。它在weblogic中以幾種方式完成。每次在會話中使用setAttribute()時,都會觸發會話複製事件。

在WL有兩種方法可以複製內存中的複製和使用數據庫來複制 。我想聽聽其他應用服務器是如何完成的。