ZooKeeper进阶学习(二)Watcher 机制和ACL(访问控制列表)

ZooKeeper进阶学习

Watcher 机制和ACL(访问控制列表)

Watcher 机制

ZooKeeper 的 Watcher 机制是其核心特性之一,它提供了一种轻量级的事件通知机制,允许客户端可以在节点上设置 Watcher,当节点发生变化时,ZooKeeper 会通知相应的客户端。Watcher 是一次性的,意味着它们在触发后就会被移除,需要重新设置

主要特性

  1. 一次性触发:
    • 每个 Watcher 只能触发一次,即当被监听的节点发生变化时,ZooKeeper 会通知客户端,并移除该 Watcher。
  2. 异步通知:
    • Watcher 机制是异步的,ZooKeeper 会通过异步回调方式通知客户端。
  3. 客户端注册:
    • 客户端可以在节点上注册 Watcher,监听节点的创建、删除、数据变化和子节点变化等事件。
  4. 事件类型:
    • NodeCreated:节点被创建。
    • NodeDeleted:节点被删除。
    • NodeDataChanged:节点的数据发生变化。
    • NodeChildrenChanged:节点的子节点列表发生变化。

设置和处理 Watcher

  1. 设置 Watcher:
    • 客户端可以通过 ZooKeeper 类的方法(如 exists、getData、getChildren 等)设置 Watcher。例如:
zooKeeper.exists("/path", true);
  1. 处理 Watcher 回调:
    客户端需要实现 Watcher 接口,处理 Watcher 事件。典型实现如下:
public class MyWatcher implements Watcher {
   
    @Override
    public void process(WatchedEvent event) {
   
        System.out.println("Received event: " + event);
    }
}
  1. 重新注册 Watcher:
    • 由于 Watcher 是一次性的,当一个 Watcher 被触发后,如果需要继续监听该节点的变化,客户端需要重新注册 Watcher。
      示例代码
  2. 以下是一个使用 ZooKeeper Watcher 机制的示例代码:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

public class ZooKeeperWatcherExample {
   

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
   
        zooKeeper = new ZooKeeper("localhost:2181", 3000, new Watcher() {
   
            @Override
            public void process(WatchedEvent event) {
   
                if (event.getType() == Event.EventType.None) {
   
                    // Connection related event
                    switch (event.getState()) {
   
                        case SyncConnected:
                            System.out.println("Connected to ZooKeeper");
                            break;
                        case Disconnected:
                            System.out.println("Disconnected from ZooKeeper");
                            break;
                        case Expired:
                            System.out.println("Session expired");
                            break;
                    }
                } else {
   
                    // Node related event
                    System.out.println
  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值