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 测试套件中进行了测试。
有没有办法找到与给定 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 测试套件中进行了测试。