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() {@Overridepublic void process(WatchedEvent watchedEvent) {//process()方法会在ZooKeeper向客户端发送一个Watcher事件通知时被调用。System.out.println("默认事件: "+watchedEvent.getType());}});//创建一个监听器:watcher是一个实现Watcher接口的对象,定义怎么样响应ZooKeeper的通知。//当/product这个节点的状态发生变化时,ZooKeeper会调用watcher的process()方法。Watcher watcher=new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("触发了"+event.getType()+"事件");}};//使用exists()方法注册监听器:在ZooKeeper中注册一个监听器来监控/product这个节点的状态//exists()会检查/product这个节点是否存在,同时注册一个监听器watcher。//当/product这个节点状态发生变化时(节点被创建,删除或者节点数据发生变化),ZooKeeper会触发watcherzooKeeper.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);}
}