我正在使用Tapestry 5.3.3集群创建应用程序。通过将HttpSession复制到集群中的所有节点来完成集群。通过序列化HttpSession进行复制。当容器尝试序列化会话时,将抛出NotSerializableException,因为org.apache.tapestry5.internal.SelectModelImpl不可序列化。 Tapestry通过ClusteredSessionImpl类将此类添加到会话中。因此,看起来Tapestry希望通过将相关信息保存到会话来实现群集友好。关于如何解决此异常的任何想法?
答案 0 :(得分:1)
Tapestry用户邮件列表提供了一些很好的建议。显然,应该避免将SelectModel持久化到会话中。这是一些回应 -
你的自定义代码是@Persist的SelectModel吗?如果是这样,您可以改为@Persist底层Collection,并在每次UI中构建SelectModel。您应该记住,HTTPSession的使用应该保持在最低限度,尤其是在集群环境中。 HTTPSession使用不能很好地扩展。 你真的需要在会话中坚持一个列表吗?您是否只需在会话中存储用户ID(或其他过滤器参数),并在每次需要服务时查找列表?如果您稍后发现查找很昂贵,您可以查看服务级别的缓存。
你应该读到这个: http://tapestry.apache.org/performance-and-clustering.html
不要@Persist或@SessionState SelectModel。这是个坏主意。正如Lance所说,如果你真的需要以某种方式坚持它,那么坚持用于创建SelectModel的List,而不是SelectModel本身。