顺序节点:北京0000000000 上海0000000001。
临时节点是和session绑定的,就是和客户端绑定。
---
会话:
---
下半节
---
看下addSession
---
// 该方法的返回值:
// true:表示当前Session存在,且没有被关闭
// false:表示当前Session不存在,或存在但被关闭了
synchronized public boolean touchSession(long sessionId, int timeout) {
if (LOG.isTraceEnabled()) {
ZooTrace.logTraceMessage(LOG,
ZooTrace.CLIENT_PING_TRACE_MASK,
"SessionTrackerImpl --- Touch session: 0x"
+ Long.toHexString(sessionId) + " with timeout " + timeout);
}
// 获取当前Session
SessionImpl s = sessionsById.get(sessionId);
// Return false, if the session doesn't exists or marked as closing
if (s == null || s.isClosing()) {
return false;
}
// 计算当前会话的超时时间所在的会话桶,即当前会话所在的时间桶
long expireTime = roundToInterval(Time.currentElapsedTime() + timeout);
// 首连时s.tickTime为0,说明当前session在0号桶
if (s.tickTime >= expireTime) {
// Nothing needs to be done
return true;
}
// 代码执行到这里,说明s.tickTime < expireTime,
// 说明当前session所在的桶落后于其将来超时时间点所在的桶
// 那么,就需要给当前session“换桶”了
// 获取当前session所在的当前桶
SessionSet set = sessionSets.get(s.tickTime);
if (set != null) {
// 将当前sessionw从桶中清除
set.sessions.remove(s);
}
// 更新当前session所在的桶
s.tickTime = expireTime;
// 从桶集合中获取到更新桶
set = sessionSets.get(s.tickTime);
// 若当前session是第一个进入到新桶的,则需要创建该桶
if (set == null) {
// 创建新桶
set = new SessionSet();
// 将新桶放入到桶集合
sessionSets.put(expireTime, set);
}
// 将当前session放入到新桶
set.sessions.add(s);
return true;
}
什么时候执行的:
1.touchSession
2.
3.重连
---
清理: