基础设施
上下文
Session scoped
名为Login
的bean,其中包含一个字段email
。Hazelcast
的情况下进行部署时,bean只会被实例化一次并保留其值。Login
bean在每个执行阶段都被反序列化(内存地址更改,并且不保留设置的电子邮件)。我们注意到的方式
登录页面正在投掷"字段为空"他们实际设置时的消息。然后我们调试了更多内容,发现bean在每个阶段都被重新实例化(使用PhaseListener)。
请注意,如果我们将bean范围更改为请求或查看,则将识别字段,但它不是实际上下文中的选项。
Hazelcast是否覆盖了JSF处理会话范围bean的方式?如果没有,为什么会发生这种情况?
编辑:Bean确实实现了Serializable
答案 0 :(得分:1)
TL; DR
将此初始化参数添加到Hazelcast网络过滤器:
<init-param>
<param-name>deferred-write</param-name>
<param-value>true</param-value>
</init-param>
当您使用与JSF的Hazelcast会话复制时,您应该知道,每次ELResolver尝试获取对会话bean的引用时,Hazelcast将为其反序列化它。这就是在每个执行阶段对您的Login bean进行反序列化的原因。
然而,Hazelcast WebFilter有一个名为“deferred-write”的参数,如果设置为true,则会将实例缓存到本地地图中并直接从那里提供给您。在每个http请求结束时,WebFilter会将存储在此地图上的所有值写入Hazelcast。