【发布时间】:2021-11-05 08:18:36
【问题描述】:
我在 4 节点集群上运行 Hazelcast,特别需要拦截会话过期事件以审核事件和其他一些清理任务。由于这些任务只需要执行一次,我尝试将MapListener<String, ExpiringSession> 作为本地地图侦听器附加到会话IMap。这不符合我的需要。
我现在正在尝试创建一个地图拦截器,但发现自己需要通过仅在拥有该特定会话条目的 Hazelcast 节点上运行某些代码来“伪造”本地地图侦听器所做的事情。
下面是代码的模型。
@Override
public Object interceptRemove(Object removedValue) {
// ApplicationSession implements ExpiringSession and also contains the session id
ApplicationSession session = (ApplicationSession) removedValue;
// Can I see if the current node actually owns the removed value?
// if the session is expired, we need to do a session logout audit
if (session.isExpired()) {
// do the logout event audit
}
// perform other tasks
return removedValue;
}
所以我的问题是,我怎么知道哪个 Hazelcast 节点“拥有”ExpiringSession,因为它可能是 4 个节点中的任何一个?我知道这似乎是一种迂回的方式,但同样,作为本地侦听器这样做并不能满足我的需求(由于我不想进入的应用程序的一些其他问题)。
【问题讨论】: