使用HazelCast和会话作用域bean时的序列化问题

3

基础设施

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

背景

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

我们是如何发现的

登录页面显示“字段为空”的消息,而实际上它们已经设置。然后我们进一步调试发现,该bean在每个阶段都会被重新实例化(使用PhaseListener)。

请注意,如果我们将bean范围更改为请求或视图,则可以识别字段,但在实际上下文中这不是一个选项。

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

编辑:该bean确实实现了Serializable

1个回答

1

简述:

在Hazelcast Web过滤器中添加此初始化参数:

<init-param>
    <param-name>deferred-write</param-name>
    <param-value>true</param-value>
</init-param>

当您使用Hazelcast会话复制与JSF时,需要注意每次ELResolver尝试获取对会话bean的引用时,Hazelcast都会为其反序列化。这就是为什么您的登录bean在每个执行阶段都被反序列化的原因。
然而,Hazelcast WebFilter有一个名为“deferred-write”的参数,如果设置为true,将把实例缓存到本地映射中,并直接从那里提供给您。在每个http请求结束时,WebFilter将写入存储在此映射中的所有值到Hazelcast。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接