11. Zookeeper JavaAPI-异步调用

Zookeeper 类中还提供了一些异步回调API, 但笔者并没有想到合适的应用场景. 因为通常当处理耗时请求时会考虑异步API, 但是Zookeeper 通常用于存储配置信息, 按理来说, 不会有太耗时的操作才对.

1. 异步API 简介

Zookeeper 中几乎对常用的API都提供了异步调用方式, 所有异步API都有以下特点:

  • 返回均为void, 因为异步执行, 返回值并没有任何意义
  • 都需要实现回调方法, 回到方法参数也很类似
  • 都需要设置一个回调参数了 ctx, 参数会原封不动地会传到回调方法
public void create(final String path, byte data[], List<ACL> acl, CreateMode createMode,  StringCallback cb, Object ctx)
public void delete(final String path, int version, VoidCallback cb, Object ctx) 
public void setData(final String path, byte data[], int version, StatCallback cb, Object ctx)
public void setACL(final String path, List<ACL> acl, int version, StatCallback cb, Object ctx)
public void getData(final String path, Watcher watcher, DataCallback cb, Object ctx)            
public void getChildren(final String path, Watcher watcher, ChildrenCallback cb, Object ctx)            
public void getACL(final String path, Stat stat, ACLCallback cb, Object ctx)           
public void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)    
...

2. 异步API 测试


import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import org.junit.BeforeClass;
import org.junit.Test;

import java.util.List;

/**
 * @Description: 测试异步API
 * @author: zongf
 * @date: 2019-02-17 10:20
 */
public class TestAPIAnsy {

    // zookeeper 地址, 多个地址以逗号割开
    private static String zkServer = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";

    // 会话超时时间
    private static int sessionTimeout = 3000;

    // zookeeper 客户端连接
    private static ZooKeeper zooKeeper;

    @BeforeClass
    public static void init() throws Exception{
        zooKeeper = new ZooKeeper(zkServer, sessionTimeout, watchedEvent ->{});
    }

    // 异步创建
    @Test
    public void create_ansy() throws KeeperException, InterruptedException {
        zooKeeper.create("/node-ansy", "just for learn async".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, String name) {
                System.out.println("rc:" + rc);
                System.out.println("path:" + path);
                System.out.println("name:" + name);
                System.out.println("ctx:" + ctx);
            }
        }, "回调结果");

        // 线程休眠5秒, 否则接收不到回调
        Thread.sleep(5000);
    }

    // 测试异步获取数据
    @Test
    public void getData_ansy() throws InterruptedException {

        zooKeeper.getData("/node-ansy", false, new AsyncCallback.DataCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
                System.out.println("rc:" + rc);
                System.out.println("path:" + path);
                System.out.println("data:" + new String(data));
                System.out.println("ctx:" + ctx);
            }
        }, "回调参数");

        // 线程休眠5秒, 否则接收不到回调
        Thread.sleep(5000);
    }

    // 测试异步获取权限
    @Test
    public void getAcl_ansy() throws InterruptedException {
        zooKeeper.getACL("/", new Stat(), new AsyncCallback.ACLCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat) {
                System.out.println("rc:" + rc);
                System.out.println("path:" + path);
                System.out.println("aclList:" + acl);
                System.out.println("ctx:" + ctx);
            }
        }, "回调参数");

        // 线程休眠5秒, 否则接收不到回调
        Thread.sleep(5000);

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值