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

顺序节点:北京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.重连

---

清理:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值