使用HazelCast与会话范围bean的序列化问题

时间:2014-12-17 16:58:52

标签: jsf-2 hazelcast session-scope

基础设施

  • JSF 2.1.17(Mojarra)
  • Hazelcast 3.3
  • JBoss EAP 6.3

上下文

  • Session scoped名为Login的bean,其中包含一个字段email
  • 在没有Hazelcast的情况下进行部署时,bean只会被实例化一次并保留其值。
  • 将Hazelcast添加到应用程序时,我们注意到Login bean在每个执行阶段都被反序列化(内存地址更改,并且不保留设置的电子邮件)。

我们注意到的方式

登录页面正在投掷"字段为空"他们实际设置时的消息。然后我们调试了更多内容,发现bean在每个阶段都被重新实例化(使用PhaseListener)。

请注意,如果我们将bean范围更改为请求或查看,则将识别字段,但它不是实际上下文中的选项。

Hazelcast是否覆盖了JSF处理会话范围bean的方式?如果没有,为什么会发生这种情况?

编辑:Bean确实实现了Serializable

1 个答案:

答案 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。