记录一次Issue关于zookeeper客户端连接和单例模式
一次代码中,我试图用enum的单例模式,在构造器中建立zookeeper的链接,发现这样行不通。把构造器改成普通的方法再调用,就可以正常的建立连接,百思不得其解
环境:
- windows10
- jdk7
- idea
- apache zookeeper
关键代码
package com.giligency.readOnlySwitch;
import com.giligency.tool.Common;
import com.giligency.tool.RunTimConfig;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.CountDownLatch;
public enum ZKMonitor {
ZK_MONITOR;
private ZooKeeper zooKeeper = null;
private final Logger logger = LoggerFactory.getLogger(ZKMonitor.class);
public void close() {
try {
zooKeeper.close();
} catch (InterruptedException e) {
logger.error("zookeeper关闭失败",e);
}
}
/**
* 初始化去连接zk
*/
ZKMonitor(){
try {
logger.debug("开始初始化连接zk");
//初始化zk
int time_out = 5000;
String zk = RunTimConfig.RUN_TIM_CONFIG.getProperties().getProperty("zk");
final CountDownLatch countDownLatch = new CountDownLatch(1);
zooKeeper = new ZooKeeper(zk, time_out, new Watcher() {
public void process(WatchedEvent watchedEvent) {
Event.KeeperState state = watchedEvent.getState();
Event.EventType type = watchedEvent.getType();
if (Event.KeeperState.SyncConnected == state) {
if (Event.EventType.None == type) {
//调用此方法测计数减一
countDownLatch.countDown();
}
}
}
});
//阻碍当前线程进行,除非计数归零
countDownLatch.await();
logger.debug("zk初始化完毕");
} catch (InterruptedException e) {
logger.error("初始化zookeeper连接失败InterruptedException ",e);
Common.isInitSuccess = false;
} catch (IOException e) {
logger.error("初始化zookeeper连接失败IOException ",e);
Common.isInitSuccess = false;
}
}
public ZooKeeper getZooKeeper() {
return ZK_MONITOR.zooKeeper;
}
public List<String> getModifyCSFList() {
return modifyCSFList;
}
}
反馈结果
就是session失败连不上去。后来我把构造器的内容改成静态代码块去初始化了。这里记录一下,说不定以后知道为啥了。