本帖最后由 arsenduan 于 2016-10-26 15:01 编辑
楼主仔细阅读下下面内容:
[mw_shl_code=java,true]private CountDownLatch connectedSemaphore = new CountDownLatch( 1 );
/**
* 创建ZK连接
* @param connectString ZK服务器地址列表
* @param sessionTimeout Session超时时间
*/
public void createConnection( String connectString, int sessionTimeout )
{
System.out.println( "开始创建连接" );
try {
zk = new ZooKeeper( connectString, sessionTimeout, this );
connectedSemaphore.await();
} catch (Exception e ) {
System.out.println( "连接创建失败,发生 IOException" );
e.printStackTrace();
}
}
* 收到来自Server的Watcher通知后的处理。
*/
@Override
public void process( WatchedEvent event ) {
System.out.println( "收到事件通知:" + event.getState() +"\n" );
if ( KeeperState.SyncConnected == event.getState() ) {
connectedSemaphore.countDown();
}
} [/mw_shl_code]
上面的代码对于避免连接建立完成之前就发出ZooKeeper操作命令出现ConnectionLoss是有用的。
因为new出ZooKeeper实例时只是建立了与服务端之间的会话,此时TCP连接可能还未建立完成,如果这时发出ZooKeeper操作命令的确会出现连接丢失异常,虽然这种概率相对较小。
当客户端与服务端连接建立之后客户端会收到一个SyncConnected事件,此时将connectedSemaphore减到零就可以让阻塞的主线程继续运行,再来发出ZooKeeper操作命令就不会出现连接丢失的异常了。
|