2010-01-19 140 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有两种方法可以复制内存中的复制和使用数据库来复制 。我想听听其他应用服务器是如何完成的。