zookeeper Curator 事件监听

PathChildrenCache watcher = new PathChildrenCache(client, ZK_PATH, true);
watcher.getListenable().addListener(new PathChildrenCacheListener() {
    @Override
    public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
        ChildData data = pathChildrenCacheEvent.getData();
    }
});
watcher.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);

NodeCache watcher = new NodeCache(client, ZK_PATH);
watcher.getListenable().addListener(new NodeCacheListener() {
    @Override
    public void nodeChanged() throws Exception {
        ChildData childData = watcher.getCurrentData();
    }
});
watcher.start();

TreeCache watcher = new TreeCache(client, ZK_PATH);
watcher.getListenable().addListener(new TreeCacheListener() {
    @Override
    public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
        ChildData data = treeCacheEvent.getData();
    }
});
watcher.start();

 

### 使用Curator框架在ZooKeeper中实现Watch机制 为了简化客户端代码并处理连接管理,推荐使用Curator框架来替代直接调用ZooKeeper API[^1]。下面展示了一个简单的例子,说明如何利用Curator框架设置观察者(Watcher),以便当特定节点的数据发生变化时能够得到通知。 #### 创建会话并与ZooKeeper建立连接 首先,创建一个`CuratorFramework`实例,并通过它与ZooKeeper服务器建立连接: ```java import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; public class WatcherExample { private static final String CONNECTION_STRING = "localhost:2181"; public static void main(String[] args) throws Exception { RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); CuratorFramework client = CuratorFrameworkFactory.newClient(CONNECTION_STRING, retryPolicy); try { client.start(); // ...后续操作... } finally { client.close(); } } } ``` #### 设置监视器(Watcher) 接下来,在指定路径上注册监听事件。这里采用的是异步方式获取数据的同时附加了监听逻辑: ```java import org.apache.curator.framework.api.BackgroundCallback; import org.apache.curator.framework.api.CuratorEvent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; // 继续之前的方法体... client.getData().usingWatcher((curatorFramework, event) -> { switch(event.getType()){ case NODE_DELETED: System.out.println("Node deleted."); break; case NODE_DATA_CHANGED: System.out.println("Data changed."); getDataAndPrint(client); // 自定义函数用于打印最新数据 break; default: System.out.println("Other events occurred"); } }).forPath("/example/path"); private static void getDataAndPrint(CuratorFramework client){ try{ byte[] data = client.getData().forPath("/example/path"); System.out.println(new String(data)); }catch(Exception e){ e.printStackTrace(); } } ExecutorService executor = Executors.newSingleThreadExecutor(); client.checkExists().inBackground((client1, event) -> System.out.printf("Received %s for path %s%n", event.getType(), event.getPath()) ).withContext(executor).forPath("/example/path"); ``` 上述代码展示了如何为某个具体的ZooKeeper节点配置监听器,一旦该节点上的数据发生更改或是被删除,则触发相应的回调函数执行自定义的操作。值得注意的是,这里的监听是一次性的;如果希望持续监控变化,则需重新设定监听或考虑其他解决方案如树形结构下的子节点变更监听等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值