zookeeper的java客户端api的监听功能
Zookeeper的java客户端api的监听功能
1.其中master slave1 slave2需要修改本地hosts文件 C:WindowsSystem32driversetchosts
192.168.1.10 master 192.168.1.11 slave1 192.168.1.12 slave2
检查是否能在本机ping通 2.监听节点的主类需要Thread.sleep(Long.MAX_VALUE); 在构造zookeeper客户端对象时,zookeeper创建了两个线程sendThread,eventThread。
public void start() {
sendThread.start();
eventThread.start();
}
其中sendThread用来接发数据,eventThread用来监听。而eventThread线程中setDaemon则是一个守护进程。Daemon() 程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端,不与前台交互,Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。一旦main线程结束,守护线程就结束。因此使得线程一直监听节点状态,需要使得main线程sleep。
EventThread() {
super(makeThreadName("-EventThread"));
setUncaughtExceptionHandler(uncaughtExceptionHandler);
setDaemon(true);
}
3.实现
public class ZookeeperWatchDemo {
ZooKeeper zk = null;
@Before
public void init() throws IOException {
zk = new ZooKeeper("master:2181,slave1:2181,slave2:2181", 2000, new Watcher() {
//内部类可读性很差,可以写成外部类
@Override
public void process(WatchedEvent event) {
if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeDataChanged) {
System.out.println(event.getPath());
System.out.println(event.getType());
System.out.println("The NodeData has changed!");
try {
zk.getData("/myboys", true, null);
} catch (InterruptedException | KeeperException e) {
e.printStackTrace();
}
}else if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged) {
System.out.println("子节点发生变化");
}else {
System.out.println("zookeeper连接成功!");
}
}
});
}
@Test
public void testGetWatch() throws KeeperException, InterruptedException, UnsupportedEncodingException {
byte[] data = zk.getData("/myboys", true, null); //监听节点数据变化
List<String> children = zk.getChildren("/myboys", true);//监听节点的子节点变化事件
System.out.println(new String(data,"utf-8"));
//时间监听线程是一个setDaemon守护线程,如果主线程退出,那么守护线程也会退出,不再监听,因此要让线程sleep
Thread.sleep(Long.MAX_VALUE);
}
}
