开课吧2020四月-zookeeper(技术内幕)-第四次课程

顺序节点:北京0000000000 上海0000000001。

临时节点是和session绑定的,就是和客户端绑定。

---

会话:

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第1张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第2张图片

---

下半节

---

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第3张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第4张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第5张图片

看下addSession

 开课吧2020四月-zookeeper(技术内幕)-第四次课程_第6张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第7张图片

---

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第8张图片


    // 该方法的返回值:
    // 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.

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第9张图片

3.重连

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第10张图片

---

清理:

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第11张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第12张图片

开课吧2020四月-zookeeper(技术内幕)-第四次课程_第13张图片

你可能感兴趣的:(开课-zookeeper)