Cometd Seti- 有没有办法找到与给定 userId 关联的 ServerSession 列表?

Cometd Seti- Is there a way to find the list of ServerSession associated with the given userId?

有没有办法找到与给定 userId 关联的 ServerSession 列表?

public boolean associate(final String userId, final ServerSession session)
    {
        if (session == null)
            throw new NullPointerException();

        LocalLocation location = new LocalLocation(userId, session);
        boolean wasAssociated = isAssociated(userId);
        boolean added = associate(userId, location);

        if (added)
        {
            session.addListener(location);
            if (_logger.isDebugEnabled())
                _logger.debug("Associated session {} to user {}", session, userId);
            if (!wasAssociated)
            {
                if (_logger.isDebugEnabled())
                    _logger.debug("Broadcasting association addition for user {}", userId);
                // Let everyone in the cluster know that this session is here
                _session.getChannel(SETI_ALL_CHANNEL).publish(new SetiPresence(true, userId));
            }
        }

        return added;
    }

如果用户已经关联,seti 不会在 SETI_ALL_CHANNEL 上发布以通知其他彗星。

详细说明-

我已经实现了 cometd oort 集群来将数据库更改通知推送到浏览器。

两个节点被认为是master/slave。主节点只接收来自数据库的通知。

用户通过从节点连接。 当用户第一次与从节点握手时,seti 发布一个用户存在添加的事件。

集群中的两个节点都知道云中的用户。 当用户刷新浏览器时,将启动新的(第二次)握手。 userId(loginUserId) 保持不变。 Seti 不会将其发布到设计正确的集群。

一段时间后,第一次握手的会话由于不活动而被删除。 presence removed 事件由 seti 触发,这也是设计所期望的。

从节点只知道用户通过第二次握手连接,而主节点不知道用户在云端。

当新事件从数据库到达时,主节点在云端看不到用户,因此没有事件传输到浏览器。而且此时主节点和从节点是连接的。连接到集群的用户在两个节点之间不同步。

我想 seti/disassociate 然后 seti/associate 同一用户的会话。

我们可以获得连接的会话列表-

seti.getOort().getBayeuxServer().getSessions();


//  clientId - previous client session id need to be identified 
    ServerSession serverSession=seti.getOort().getBayeuxServer().getSession(clientId);

通过client Id,可以获取Server Session,为用户解除关联。

 seti.disassociate(loginUserId, serverSession); 

 boolean association=seti.associate(loginUserId, serverSession);//new  handshake- serverSession

如果您有两个会话连接到从属节点,其中一个消失了,那么 Seti 将不会广播存在删除事件,因为只有当所有节点上 userId 的关联消失了。

这正是为了避免一个节点还有关联,其他节点却认为该用户已从云端消失。

如果您有证据表明这种情况正在发生,那么这是一个错误,但此特定行为已在 CometD 测试套件中进行了测试。