另一个session建立时zookeeper需要的参数是默认watcher(监视者)。在客户端发生任何变化时,watcher都会发出通知。 例如客户端失去和服务器的连接、客户端session到期等。watcher默认的初始状态是disconnected。(也就是说任何状态改变事件都由 客户端库发送到watcher)。当新建一个连接时,第一个发送给watcher的事件通常就是session连接事件。
客户端发送请求会使session保持活动状态。客户端会发送ping包(译者注:心跳包)以保持session不会超时。Ping包不仅让服务端 知道客户端仍然活动,而且让客户端也知道和服务端的连接没有中断。Ping包发送时间正好可以判断是否连接中断或是重新启动一个新的服务器连接。
和服务器的连接建立成功,当一个同步或异步操作执行后,有两种情况会让客户端库判断失去连接:
应用在session上请求了一个已经失效的操作
zookeeper服务器有一个等待中的操作时,客户端会从那台服务器断开连接。即服务器有等待的异步调用。
3.2.0版本新增内容 —— SessionMovedException 一个客户端无法查看的内部异常SessionMovedException。这个异常发生在服务端收到一个请求,这个请求的session已经在另一个服 务器上重新连接。发生这种情况的原因通常是客户端发送完请求后,由于网络延时,客户端超时重新和其他服务器建立连接,当请求包到达第一台服务器时,服务器 发现session已经移除并关闭了和客户端的连接。客户端一般不用理会这个问题,但是有一种情况值得注意,当两台客户端使用事先存储的session id和密码试图创建同一个连接时,第一台客户端重建连接,第二台则会被中断。