一般情况下,zk客户端与服务端建立连接后,会在2/3*sessionTime*1/2的时候发送一个心跳消息到服务端,保持会话更新。但是可能在某个时候网络中断可能导致客户端无法连接上服务端,此时客户端会不停的依次重试各个服务器,一直到连接上某个服务器为止。如果在未连接上这段时间内,服务端session已经过期,(参见SessionTracker的实现SessionTrackerImpl),它是依靠一个线程对过期的session进行清理,并关闭掉连接。
synchronized public void run() {
try {
while (running) {
currentTime =System.currentTimeMillis();
if (nextExpirationTime >currentTime) {
this.wait(nextExpirationTime - currentTime);
continue;
}
SessionSet set;
set =sessionSets.remove(nextExpirationTime);
if (set != null) {
for (SessionImpl s :set.sessions) {
sessionsById.remove(s.sessionId);
expirer.expire(s);
}
}