sessionTimeOut表示zookeeper的连接会话的超时时间。由客户端建立连接时设置,但不仅仅由客户端决定,还与服务端配置有关。相关源码如下所示:
int sessionTimeout = connReq.getTimeOut();
byte passwd[] = connReq.getPasswd();
int minSessionTimeout = getMinSessionTimeout();
if (sessionTimeout < minSessionTimeout) {
sessionTimeout = minSessionTimeout;
}
int maxSessionTimeout = getMaxSessionTimeout();
if (sessionTimeout > maxSessionTimeout) {
sessionTimeout = maxSessionTimeout;
}
cnxn.setSessionTimeout(sessionTimeout);
根据以上源码可知,sessionTimeout由客户端上报的timeout和服务端自身的sessionTimeout共同决定。
(1)如果上报的timeout小于minSessionTimeout则设置timeout为minSessionTimeout。
(2)如果上报的timeout大于maxSessionTimeout则,设置timeout为maxSessionTimeout。
(3)如果介于两则之间,则以上报的时间为准。
那么现在就有问题了,如果服务端未设置minSessionTimeout和maxSessionTimeout,则如何判定呢?
针对上述问题,源码中也有对应的处理逻辑:
public int getMinSessionTimeout() {
return minSessionTimeout == -1 ? tickTime * 2 : minSessionTimeout;
}
public int getMaxSessionTimeout() {
return maxSessionTimeout == -1 ? tickTime * 20 : maxSessionTimeout;
}
从代码中易看出,minSessionTimeout和maxSessionTimeout的缺省值与tickTime参数相关。
代码中tickTime为Zookeeper服务端配置,默认为3000,单位为毫秒。也就是说minSessionTimeout和maxSessionTimeout与tickTime有关。