【问题标题】:Serialization problems using HazelCast with session scoped bean使用带有会话范围 bean 的 HazelCast 的序列化问题
【发布时间】:2014-12-17 16:58:51
【问题描述】:

基础设施

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

上下文

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

我们如何注意到

登录页面在实际设置时抛出“字段为空”消息。然后我们对此进行了更多调试,发现 bean 在每个阶段都被重新实例化(使用 PhaseListener)。

请注意,如果我们将 bean 范围更改为 request 或 view,这些字段将被识别,但在实际上下文中它不是一个选项。

Hazelcast 是否覆盖了 JSF 处理会话范围 bean 的方式?如果不是,为什么会这样?

编辑: bean 确实实现了Serializable

【问题讨论】:

    标签: jsf-2 hazelcast session-scope


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 2013-02-26
      • 2010-12-29
      • 2010-10-29
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多