package io.github.dunwu.javatech.zk.example;

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooKeeper.States;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * ZooKeeper 连接示例
 *
 * @author <a href="mailto:[email protected]">Zhang Peng</a>
 * @since 2018-07-12
 */
public class ZooKeeperConnection {

    private static final String HOST = "localhost";

    final CountDownLatch connectedSignal = new CountDownLatch(1);

    // declare zookeeper instance to access ZooKeeper ensemble
    private ZooKeeper zoo;

    public static void main(String[] args) throws IOException, InterruptedException {
        ZooKeeperConnection zooKeeperConnection = new ZooKeeperConnection();
        ZooKeeper zk = zooKeeperConnection.connect(HOST);
        States state = zk.getState();
        System.out.println("ZooKeeper isAlive:" + state.isAlive());
        zk.close();
    }

    // Method to connect zookeeper ensemble.
    public ZooKeeper connect(String host) throws IOException, InterruptedException {

        zoo = new ZooKeeper(host, 5000, new Watcher() {
            @Override
            public void process(WatchedEvent we) {
                if (we.getState() == KeeperState.SyncConnected) {
                    connectedSignal.countDown();
                }
            }
        });

        connectedSignal.await();
        return zoo;
    }

    // Method to disconnect from zookeeper server
    public void close() throws InterruptedException {
        zoo.close();
    }

}