更新 Apache Ignite WebSession 属性
Updating Apache Ignite WebSession attributes
我们目前正在将 Apache Ignite 集成到我们的应用程序中以在集群中共享会话。参见 Ignite docs。
此时我们可以成功地在两个本地 tomcat 实例之间共享会话,但是有一个用例,(似乎)Ignite 不支持。
在我们的应用程序中,我们有一个名为 'Profile' 的会话对象。此配置文件是用户特定的,当用户浏览应用程序时,所有类型的属性都会添加到此对象。
我们通过以下方式(伪代码)更新'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' class,我看到以下方法:
public void setAttribute(String name, Object val) {
attrs.put(name, val);
if (updates != null)
updates.add(new T2<>(name, val));
}
简而言之:Ignite 期望在每次更新会话对象后调用 session.setAttribute 方法,因此 Ignite 会将更改添加到其内部 'updates' 集合中,该集合用于更新点燃网格中的对象。我们的应用程序的解决方案是更改我们的应用程序代码,在每次更新后调用 setAttribute,但我们也使用代码依赖性,我们无法更改并且可能不会在会话对象更改后调用 setAttribute..
Ignite 需要在会话对象更改后调用 setAttribute 是否有原因,或者这是 Ignite 中的缺陷?
你说得对,现在就是这样实现的,唯一的解决方法是在每次更新时显式调用 setAttribute()
。我认为这可以改进并创建 Apache Ignite 票证:https://issues.apache.org/jira/browse/IGNITE-2594
我们目前正在将 Apache Ignite 集成到我们的应用程序中以在集群中共享会话。参见 Ignite docs。 此时我们可以成功地在两个本地 tomcat 实例之间共享会话,但是有一个用例,(似乎)Ignite 不支持。
在我们的应用程序中,我们有一个名为 'Profile' 的会话对象。此配置文件是用户特定的,当用户浏览应用程序时,所有类型的属性都会添加到此对象。
我们通过以下方式(伪代码)更新'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' class,我看到以下方法:
public void setAttribute(String name, Object val) {
attrs.put(name, val);
if (updates != null)
updates.add(new T2<>(name, val));
}
简而言之:Ignite 期望在每次更新会话对象后调用 session.setAttribute 方法,因此 Ignite 会将更改添加到其内部 'updates' 集合中,该集合用于更新点燃网格中的对象。我们的应用程序的解决方案是更改我们的应用程序代码,在每次更新后调用 setAttribute,但我们也使用代码依赖性,我们无法更改并且可能不会在会话对象更改后调用 setAttribute..
Ignite 需要在会话对象更改后调用 setAttribute 是否有原因,或者这是 Ignite 中的缺陷?
你说得对,现在就是这样实现的,唯一的解决方法是在每次更新时显式调用 setAttribute()
。我认为这可以改进并创建 Apache Ignite 票证:https://issues.apache.org/jira/browse/IGNITE-2594