转载请注明出处: jiq•钦's technical Blog
本文将主要关注Curator是如何处理连接丢失和会话终止这两个关键问题的。
1. 连接丢失的处理
Curator中利用类ConnectionState来管理客户端到ZooKeeper集群的连接状态,其中用到原子布尔型变量来标识当前连接是否已经建立:
private final AtomicBoolean isConnected=new AtomicBoolean(false);
在事件处理函数中(
ConnectionState
实现了Watcher接口)修改
isConnected
的值:@Override
public void process(WatchedEvent event)
{
//逐个调用parentWatchers容器中的Watcher的process函数
for ( Watcher parentWatcher :parentWatchers )
{
TimeTrace timeTrace = new TimeTrace("connection-state-parent-process",tracer.get());
parentWatcher.process(event);
timeTrace.commit();
}
//记录旧连接状态
boolean wasConnected =isConnected.get();
boolean newIsConnected = wasConnected;
if ( event.getType() ==Watcher.Event.EventType.None )
{
//获取新连接状态
newIsConnected =checkState(event.getState(), wasConnected);
}
//若状态发生变化,则修改
if ( newIsConnected != wasConnected )
{
isConnected.set(newIsConnected);
connectionStartMs = System.currentTimeMillis();
}
}
其中checkState函数获取当前连接状态是否为已连接:
private boolean checkState(Event.KeeperState state, boolean wasConnected)
{
boolean isConnected = wasConnected;
boolean checkNewConnectionString =true;
switch ( state )
{
default:
//连接丢失
case Disconnected:
{