ZooKeeper-API基础

为了完成本关任务,你需要掌握: 1.回调函数作用; 2.异步回调函数的接口; 3.异步回调函数的类型及适用范围。

回调函数的作用

在前三节实训中,我们在异步调用的方法中用到了回调函数,异步回调机制类似 watcher 机制,都是客户端向服务端发送请求后不阻塞客户端线程,继续往后面执行代码,当服务端执行完客户端的请求后,再往客户端发送执行结果。

回调函数的类型

回调函数有不同的类型,主要有以下几种:

  • VoidCallback:返回 void 类型的回调函数,异步删除节点就是用的该回调函数,它的 processResult(int rc, String path, Object ctx) 方法有 3 个参数,其中, rc 表示返回结果; path 表示创建节点的路径; ctx 表示上下文内容;

  • StatCallback :处理返回 Stat 结构的回调函数,异步获取节点状态就是用的该回调函数,它的 processResult(int rc, String path, Object ctx, Stat stat) 方法有 4 个参数,其中,前 3 个参数含义与前一种相同, stat 表示 path 路径节点的状态;

  • DataCallback :处理返回 data 和 Stat 结构的回调函数,异步获取节点数据就是用的该回调函数,它的 processResult(int rc, String path, Object ctx, byte data[], Stat stat)方法有 5 个参数,其中, data 表示节点的数据,其余参数与前一种相同;

  • StringCallback :处理返回节点名的回调函数,异步创建节点就是用的该回调函数,它的 processResult(int rc, String path, Object ctx, String name) 方法有 4 个参数,前 3 个参数含义与前一种相同,name 表示创建节点的名字。

回调函数的使用

要想使用回调函数,需要根据功能的不同实现不同的回调函数接口,且需要重写 processResult 方法。 回调函数使用示例:

import org.apache.zookeeper.*;
import java.io.IOException;
public class MyTest {

// 异步创建节点
public static void createNodeSync() throws KeeperException, InterruptedException{
zk.create("/zk-test-create-async-sequential","async-sequential".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL,new MyStringCallBack(),"CreateNode");
}

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
// 连接 ZooKeeper 服务器
...
// 异步创建节点
createNodeSync();
}
// 回调函数
public static class MyStringCallBack implements AsyncCallback.StringCallback{
// 重写 processResult 方法
@Override
public void processResult(int i, String s, Object o, String s1) {
// 打印节点路径
System.out.println(s);
}
}
}

执行结果:

/zk-test-create-async-sequential

上述代码中,类 MyStringCallBack 实现了 AsyncCallback.StringCallback 回调函数接口,重写了 processResult 方法,在该方法中输出了服务器执行后返回的节点路径。

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,使用异步方法删除 /mycallnode 节点,并完成 VoidCallBack 类型回调函数编写,输出上下文信息 ctx。

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
 
import java.io.IOException;
 
public class Student {
    // 初始化 ZooKeeper 实例
    private ZooKeeper zk;
    // 实现一个 Watcher
    private Watcher wh = new Watcher() {
        // 重写 process 方法
        public void process(WatchedEvent event) {
            System.out.println(event);
        }
    };
    // 连接ZooKeeper服务器
    public ZooKeeper createZKInstance() throws IOException {
        zk = new ZooKeeper("localhost:2181", 15000, this.wh);
        return zk;
    }
 
    // 异步删除节点 /mycallnode
    public  void deleteNode() throws IOException, KeeperException, InterruptedException {
        // 请在此处编写代码
        /********* Begin *********/
        zk.delete("/mycallnode",-1,new MyStringCallBack(),"delete");
        /********* End *********/
 
    }
        // 请在此处编写代码,完成回调函数的编写
        /********* Begin *********/    
public static class MyStringCallBack  implements AsyncCallback.VoidCallback{  
        // 重写 processResult 方法  
        @Override  
        public void processResult(int rc, String path, Object ctx) {             
            // 打印节点路径  
            System.out.println(ctx);  
        }  
    }  
        /********* End *********/
}

你可能感兴趣的:(linux,zookeeper,大数据,java,java-zookeeper,zookeeper)