- 前提:
使用zk客户端连接zookeeper时,保证zk的服务已经启动。
- 加入maven依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
- 代码:
package cn.lxm.attendance.controller;
import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
* @author lxm
* @version 1.1
* @date 2019/11/22 0022 16:43
*/
public class ZookeeperTest implements Watcher {
// 由于zk客户端与服务器连接是异步操作,当zk服务端响应连接完成,客户端和服务器才算真正的连接上。连接完成时,zk服务会通过Watcher机制,通知到zk的客户端
// 所以使用闭锁来实现线程等待
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
/*
zk客户端连接分为两步:
1. 调用 new ZooKeeper构造函数(异步方法),这一步操作是建立一个可用的会话连接。此时zk的state = CONNECTING
2. 会话真正的创建成功,会发送一个事件通知客户端,这个事件就是:Watcher。此时zk的state=CONNECTED
*/
// 异步的创建过程,创建完成时,会调用ZookeeperTest的Watcher通知机制
ZooKeeper zooKeeper = new ZooKeeper("192.168.1.28:2181", 5000, new ZookeeperTest());
System.out.println("还未完全建立连接的zk客户端状态 = " + zooKeeper.getState());
// 等待连接完成
countDownLatch.await();
System.out.println("zk客户端与服务端已建立连接状态 = " + zooKeeper.getState());
}
@Override
public void process(WatchedEvent event) {
// 节点事件类型
Event.EventType type = event.getType();
// zookeeper连接状态
Event.KeeperState state = event.getState();
System.out.println(state);
switch (type) {
case None:
System.out.println("None");
break;
case NodeCreated:
System.out.println("NodeCreated");
break;
case NodeDataChanged:
System.out.println("NodeDataChanged");
break;
case NodeDeleted:
System.out.println("NodeDeleted");
break;
case NodeChildrenChanged:
System.out.println("NodeChildrenChanged");
break;
default:
break;
}
countDownLatch.countDown();
}
}
- 注意点
- zk的客户端连接是异步的;
- zk建立连接时,不会立即建立连接
- zk的连接有两个状态的改变(CONNECTED才算真正的连接上):
- CONNECTING(连接中)
- CONNECTED(已连接)
- zk连接成功后,会给客户端发送一个watche事件通知,通知zk连接的结果