package cn.jpush.iapp.zk.monitor;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
public class ZookeeperClient {
private static ZooKeeper zookeeper;
private static CountDownLatch latch;
public static ZooKeeper getZooKeeper() {
if (zookeeper == null) {
synchronized (ZookeeperClient.class) {
if (zookeeper == null) {
latch = new CountDownLatch(1);
zookeeper = buildClient();//如果失败,下次还有成功的机会
try {
latch.await(30, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch = null;
}
}
}
}
return zookeeper;
}
private static ZooKeeper buildClient() {
try {
return new ZooKeeper("172.16.101.233:2791,172.16.101.244:2791,192.168.249.241:2791,192.168.249.250:2791,192.168.249.223:2791", 10000, new SessionWatcher());
} catch (IOException e) {
throw new RuntimeException("init zookeeper fail.", e);
}
}
static class SessionWatcher implements Watcher {
public void process(WatchedEvent event) {
if (event.getState() == KeeperState.SyncConnected) {
if (latch != null) {
latch.countDown();
}
} else if (event.getState() == KeeperState.Expired) {
System.out.println("[SUC-CORE] session expired. now rebuilding");
close();
getZooKeeper();
}
}
private void close() {
System.out.println("[SUC-CORE] close");
if (zookeeper != null) {
try {
zookeeper.close();
zookeeper = null;
} catch (InterruptedException e) {
}
}
}
}
public static void main(String[] args) throws Exception {
ZooKeeper zk = ZookeeperClient.getZooKeeper();
long sessionId = zk.getSessionId();
// close the old connection
new ZooKeeper("172.16.101.233:2791,172.16.101.244:2791,192.168.249.241:2791,192.168.249.250:2791,192.168.249.223:2791", 30000, null, sessionId, zk.getSessionPasswd()).close();
Thread.sleep(60000L);
// rebuild a new session
long newSessionid = ZookeeperClient.getZooKeeper().getSessionId();
// check the new session
String status = newSessionid != sessionId ? "OK" : "FAIL";
System.out.println(sessionId+"--->"+newSessionid+ ", status: " +status);
// close the client
ZookeeperClient.getZooKeeper().close();
Thread.currentThread().join();
}
}
zookeeper掉线、会话过期重连代码
最新推荐文章于 2023-08-05 17:07:25 发布