Zookeeper_Java Example

[TOC]

A Simple Watch Client

我们开发一个简单的watch客户端,用于监控zk上的node的改变。

条件

客户端需要如下条件:

  • 需要如下参数

    • zk服务地址

    • znode名称,也就是用于监控的节点名称

    • 带参的执行程序

  • 获取关联znode的数据,启动执行

  • 如果znode改变,客户端重新获取数据,重新执行

  • 如果znode消失,客户端关闭执行

程序设计

一般的,zk应用分为俩部分,一部分用于维持连接,一部分用于监控数据。 在本实例中,Executor用于维护zk的连接,DataMonitor则用于监控zk树上的数据。同时Executor作为主线程,包含了主要的执行逻辑。

Executor

executor 对象是主要的容器,它包含了zookeeper对象,DataMonitor

 public static void main(String[] args) {
    if (args.length < 4) {
        System.err
                .println("USAGE: Executor hostPort znode filename program [args ...]");
        System.exit(2);
    }
    String hostPort = args[0];
    String znode = args[1];
    String filename = args[2];
    String exec[] = new String[args.length - 3];
    System.arraycopy(args, 3, exec, 0, exec.length);
    try {
        new Executor(hostPort, znode, filename, exec).run();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public Executor(String hostPort, String znode, String filename,
        String exec[]) throws KeeperException, IOException {
    this.filename = filename;
    this.exec = exec;
    zk = new ZooKeeper(hostPort, 3000, this);
    dm = new DataMonitor(zk, znode, null, this);
}

public void run() {
    try {
        synchronized (this) {
            while (!dm.dead) {
                wait();
            }
        }
    } catch (InterruptedException e) {
    }
}

回调Executor的任务,通过从命令行传入名称来启动和关闭执行。

Last updated

Was this helpful?