ZooKeeper设置监听器

发布于:2024-04-20 ⋅ 阅读:(21) ⋅ 点赞:(0)

ZooKeeper设置监听器,通过getData()/getChildern()/xists()方法。
步骤:
1.创建监听器:创建一个实现Watcher接口的类,实现process()方法。这个方法会在ZooKeeper向客户端发送一个Watcher事件通知的时候被调用。
2.注册监听器:使用getData(),getChildern(),或exists()方法为特定的znode注册监听器。方法的第二个参数是一个布尔值,若为true,表示该znode设置监听器。
3.触发监听器:当znode发生变化时,比如节点内容改变,节点下的子节点列表改变,ZooKeeper会触发相应的监听器,并调用process()方法。
注:
getData()和exists()方法可以设置数据监视点,当节点的数据发生变化时,会触发监听器。
getChidren()方法可以设置子节点监视点,当节点的子节点列表发生变化时,会触发监听器。
ZooKeeper的监听器是一次性的,一旦触发了监听器,还想继续监听这个节点的变化,需要重新注册监听器。
示例如下:

package com.example.demoone;

import com.cloudera.impala.jdbc41.internal.apache.zookeeper.KeeperException;
import com.cloudera.impala.jdbc41.internal.apache.zookeeper.WatchedEvent;
import com.cloudera.impala.jdbc41.internal.apache.zookeeper.Watcher;
import com.cloudera.impala.jdbc41.internal.apache.zookeeper.ZooKeeper;

import java.io.IOException;

/**
 * @author LSY
 * @DATE 2024/4/19 21:05
 */
public class ZooKeeperWatcherDemo {
    public static void main(String[] args) throws InterruptedException, KeeperException, IOException {
        //创建ZooKeeper客户端实例,这个客户端会连接到运行在本地机器的2181端口的ZooKeeper服务器
        //会话超时时间是3000毫秒,当接收到Watcher事件通知时,会调用Watcher的Process()方法。
        //localhost:2181 :是ZooKeeper服务器的地址和端口号。
        //3000:会话超时时间,单位是毫秒。
        // 如果在这段时间内,客户端没有与服务器进行任何交互(发送请求或接收响应),
        // 服务器会认为这个会话已经超时,然后关闭这个会话。
        ZooKeeper zooKeeper=new ZooKeeper("localhost:2181", 3000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                //process()方法会在ZooKeeper向客户端发送一个Watcher事件通知时被调用。
                System.out.println("默认事件: "+watchedEvent.getType());
            }
        });
        //创建一个监听器:watcher是一个实现Watcher接口的对象,定义怎么样响应ZooKeeper的通知。
        //当/product这个节点的状态发生变化时,ZooKeeper会调用watcher的process()方法。
        Watcher watcher=new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("触发了"+event.getType()+"事件");
            }
        };
        //使用exists()方法注册监听器:在ZooKeeper中注册一个监听器来监控/product这个节点的状态
        //exists()会检查/product这个节点是否存在,同时注册一个监听器watcher。
        //当/product这个节点状态发生变化时(节点被创建,删除或者节点数据发生变化),ZooKeeper会触发watcher
        zooKeeper.exists("/product",watcher);

        //使用getData()方法注册
        // 监听器:在ZooKeeper中获取/product这个节点的数据,并注册一个监听器来监控这个节点的状态。
        //getData()方法会读取/product这个节点的数据,同时注册一个监听器watcher。
        //当/product这个节点的数据发生变化时,ZooKeeper会触发watcher。
		//zooKeeper.getData("/product",watcher,null);

        //使用getChildren()方法注册监听器
        //在ZooKeeper中获取/product这个节点的子节点列表,并注册一个监听器来监控这个节点的子节点列表,
        //并注册一个监听器来监控这个节点的子节点列表的变化。
        //getChildren()方法会读取/product这个节点的子节点列表,同时注册一个监听器watcher.
        //当/product这个节点的子节点列表发生变化时(例如,有子节点被添加或删除),ZooKeeper会触发watcher.
        //watcher是一个实现了Watcher接口的对象,它定义了如何响应ZooKeeper的通知。
        //当/product这个节点的子节点列表发生变化时,ZooKeeper会调用watcher的process()方法。
		//zooKeeper.getChildren("/product",watcher);

        //让主线程等待,方便观察监听器的触发情况
        Thread.sleep(Long.MAX_VALUE);
    }
}

在这里插入图片描述