更新 Apache Ignite WebSession 属性

问题描述 投票:0回答:2

我们目前正在将 Apache Ignite 集成到我们的应用程序中,以在集群中共享会话。请参阅Ignite 文档。 此时,我们可以成功地在两个本地 tomcat 实例之间共享会话,但有一个用例(似乎)不受 Ignite 支持。

在我们的应用程序中,我们有一个称为“配置文件”的会话对象。该配置文件是特定于用户的,当用户浏览应用程序时,所有类型的属性都会添加到该对象中。

我们通过以下方式更新“Profile”对象(伪代码):

profile = request.getSession().getProfile(); //Get Profile object from session
profile.setLastVisitedPage("test");

如果没有 Apache Ignite,我们的会话将包含“setLastVisitedPage”(“test”)的正确值。但是当使用 Ignite 时,Ignite 'WebSession' 对象的工作方式似乎有点不同:在会话对象中设置 'setLastVisitedPage' 值时,WebSession 首先会正确包含正确的值('test'),但是当浏览到下一页,从 Ignite 缓存解析的 WebSession 对象不包含更改的“setLastVisitedPage”属性。

我查看了 Ignite 代码,我想,我知道为什么它没有按预期工作。查看 Ignite 'WebSession' 类,我看到以下方法:

public void setAttribute(String name, Object val) {
    attrs.put(name, val);

    if (updates != null)
        updates.add(new T2<>(name, val));
}

简而言之:Ignite 期望在每次更新会话对象后,调用 session.setAttribute 方法,因此 Ignite 会将更改添加到其内部“更新”集合中,该集合用于更新 Ignite 网格中的对象。我们应用程序的解决方案是更改我们的应用程序代码,在每次更新后调用 setAttribute,但我们也使用代码依赖项,我们无法更改它,并且在会话对象更改后可能不会调用 setAttribute ..

Ignite 需要在会话对象更改后调用 setAttribute 是否有原因,或者这是 Ignite 的缺陷?

java tomcat ignite
2个回答
0
投票

你是对的,这就是现在的实现方式,唯一的解决方法是在每次更新时显式调用

setAttribute()
。我认为这可以改进并创建 Apache Ignite 票证:https://issues.apache.org/jira/browse/IGNITE-2594


0
投票

看起来此问题已针对 WebSession.java 修复,但针对 WebSessionV2.java 尚未修复(KeepBinary 切换)。 这对于二进制对象来说不是必需的吗?

© www.soinside.com 2019 - 2024. All rights reserved.