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);
	} 
}
经验分享 程序员 微信小程序 职场和发展