1.创建基类:
package zookeeper.client;
public class ClusterBase extends StandaloneBase {
private final static String CLUSTER_CONNECT_STR="192.168.109.200:2181,192.168.109.200:2182,192.168.109.200:2183,192.168.109.200:2184";
private static final int CLUSTER_SESSION_TIMEOUT=60 * 1000;
@Override
protected String getConnectStr() {
return CLUSTER_CONNECT_STR;
}
@Override
protected int getSessionTimeout() {
return CLUSTER_SESSION_TIMEOUT;
}
}
2.创建具体类:
主要看testReconnect()方法,实现了自动重连。
package zookeeper.client;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
@Slf4j
public class ClusterOperations extends ClusterBase {
@Test
public void testReconnect() throws InterruptedException {
while (true){
try {
Stat stat = new Stat();
byte[] data = getZooKeeper().getData("/zookeeper", false, stat);
log.info("get data : {}", new String(data));
TimeUnit.SECONDS.sleep(5);
}catch (Exception e){
e.printStackTrace();
log.info(" 开始重连......");
while (true){
log.info("zookeeper status :{}",getZooKeeper().getState().name());
if (getZooKeeper().getState().isConnected()) {
break;
}
TimeUnit.SECONDS.sleep(3);
}
}
}
}
@Test
public void testReadonly() throws KeeperException, InterruptedException {
ZooKeeper zooKeeper = getZooKeeper();
Stat stat = new Stat();
Watcher watcher = new Watcher() {
@SneakyThrows
@Override
public void process(WatchedEvent event) {
if ((event.getState() == Event.KeeperState.SyncConnected
|| event.getState() == Event.KeeperState.ConnectedReadOnly)
&& event.getType() == Event.EventType.NodeDataChanged) {
byte[] data = zooKeeper.getData("/node", this, stat);
log.info("数据发生变化: {}",new String(data));
}
}
};
while (true){
try {
byte[] data = zooKeeper.getData("/node", watcher, stat);
log.info("session:{}, data from test node :{} ",zooKeeper.getSessionId(),new String(data));
TimeUnit.SECONDS.sleep(3);
}catch (Exception e){
int count = 0;
while (zooKeeper.getState() != ZooKeeper.States.CONNECTED
&& zooKeeper.getState() != ZooKeeper.States.CONNECTEDREADONLY ){
TimeUnit.SECONDS.sleep(3);
log.info("now state: {} , try: {} times ",zooKeeper.getState().name(), ++count);
}
}
}
}
}
3.运行代码后,看看当前连接的是哪台机器(2181):
4.将2181这台机器挂掉,看看代码控制台是怎么重连的:
看到控制台已经产生异常,并且开始重连了。(代码是丑陋了点,这一块curator做的比较好)