专注于 JetBrains IDEA 全家桶,永久激活,教程
提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,等工具的永久激活

zkclient的使用

一、zkclient使用示例代码

添加zkclient的jar包,maven代码

        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.11</version>
        </dependency>

代码如下:

import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

public class ZKClientTest {

    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        ZkClient zkClient = new ZkClient("127.0.0.1:2181",5000);
        System.out.println("ZK 成功建立连接!");

        String path = "/zk-test";
        // 注册子节点变更监听(此时path节点并不存在,但可以进行监听注册)
        zkClient.subscribeChildChanges(path, new IZkChildListener() {
            public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                System.out.println("路径" + parentPath +"下面的子节点变更。子节点为:" + currentChilds );
            }
        });

        zkClient.subscribeDataChanges(path, new IZkDataListener() {

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                // TODO Auto-generated method stub
                System.out.println("路径" + dataPath + "已经被删除!");
            }

            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
                // TODO Auto-generated method stub
                System.out.println("路径" + dataPath + "的数据变成" + data);
            }
        });

        // 递归创建子节点(此时父节点并不存在)
        zkClient.createPersistent("/zk-test/a1",true);
        Thread.sleep(5000);
        System.out.println(zkClient.getChildren(path));

        // 递归创建子节点(此时父节点并不存在)
        zkClient.createPersistent("/zk-test/a2",true);
        Thread.sleep(5000);
        System.out.println(zkClient.getChildren(path));

        // 递归创建子节点(此时父节点并不存在)
        zkClient.createPersistent("/zk-test/b1",true);
        Thread.sleep(5000);
        System.out.println(zkClient.getChildren(path));

        zkClient.writeData("/zk-test", "/zk-test-data");
        Thread.sleep(5000);

        zkClient.writeData("/zk-test/a1", "/zk-test/a1-data");
        Thread.sleep(5000);
        zkClient.writeData("/zk-test/a2", "/zk-test/a2-data");
        Thread.sleep(5000);
        zkClient.writeData("/zk-test/b1", "/zk-test/b1-data");
        Thread.sleep(5000);

        String dataString = (String)zkClient.readData("/zk-test");
        System.out.println("/zk-test 中的数据" + dataString);
        String dataa1 = (String)zkClient.readData("/zk-test/a1");
        System.out.println("/zk-test/a1 中的数据" + dataa1);
        String dataa2 = (String)zkClient.readData("/zk-test/a2");
        System.out.println("/zk-test/a2 中的数据" + dataa2);
        String datab1 = (String)zkClient.readData("/zk-test/b1");
        System.out.println("/zk-test/b1 中的数据" + datab1);

        System.out.println("完成1");
        zkClient.createEphemeral("/zk-test/t1", "zkt1临时节点数据");
        Thread.sleep(5000);
        System.out.println("完成2");

        //创建持久序列节点
        zkClient.createPersistentSequential("/zk-test/ps", "ps1");
        zkClient.createPersistentSequential("/zk-test/ps", "ps2");
        zkClient.createPersistentSequential("/zk-test/ps", "ps3");

        // 递归删除节点
        System.out.println("完成0");
        zkClient.deleteRecursive("/zk-test");
        System.out.println("完成00");

    }

}

二、zkClient的基本操作

在使用zkClient操作Zookeeper时,基本的操作都封装在ZkClient类中,使用时直接创建ZkClient对象,调用其相应的方法即可

1)创建连接

直接在ZkClient的构造函数中指定连接参数,完成对象创建后连接也就已经创建好。在ZkClient中提供了以下几个构造函数:
public ZkClient(String serverstring)
public ZkClient(String zkServers, int connectionTimeout)
public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)
ZkClient(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer)
ppublic ZkClient(final String zkServers, final int sessionTimeout, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)
public ZkClient(IZkConnection connection)
public ZkClient(IZkConnection connection, int connectionTimeout)
public ZkClient(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer)
public ZkClient(final IZkConnection zkConnection, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)
构造器参数的含义如下:
serverstring 可以指定单个服务器地址也可以是多个,这个和原 API 创建连接构造参数是一样的含义。
connectionTimeout,sessionTimeout 是连接超时时间和会话超时时间。单位都是毫秒,其中会话默认是 30000 毫秒,也就是 30 秒。
connection 是 IZkConnection 的接口实现类。
zkSerializer 自定义的序列化器。
operationRetryTimeout 是在与服务连接断开后,进行重试操作的最长时间。也就是说,如果断开时间未超过operationRetryTimeout,则所有操作进行重试。operationRetryTimeout单位也是毫秒,如果传入小于0的值,则一直进行操作重试,直至与服务的连接恢复。

2)创建节点

String create(final String path,Object data,final CreateMode mode)
String create(final String path,Object data,final List acl,final CreateMode mode)
void create(final String path,Object data,final CreateMode mode,final AsyncCallback.StringCallback callback,final Object data)
void createEphemeral(final String path)
void createEphemeral(final String path,final Object data)
void createPersistent(String path)
void createPersistent(String path,boolean createParents)
void createPersistent(String path,Object data)
void createPersistent(String path,List acl,Object data)
void createPersistentSequential(String path,Object data)
void createEphemeralSequential(final String path,final Object data)
创建节点和原生 API 相比,原生只能传 byte 数组,这里可以传 Object。而且父节点不存在可以指定是否创建。

3)删除节点

boolean delete(final String path)
delete(final String path,final AsyncCallback.VoidCallback callback,final Object context)
boolean deleteRecursive(String path)
说一下 deleteRecursive,原生 API 删除节点如果有子节点则必须把子节点都删掉才可以,这里的函数则不需要,它会自动删除所有的子节点。

4)读取数据

(一)、getChildren
List getChildren(String path)
(二)、getData
T readData(String path)
T readData(String path,boolean returnNullIfPathNotExists)
T readData(String path,Stat stat)
这里说一下 returnNullIfPathNotExists,原生 API 读取数据,如果 path 不存在就会报错,这里设置 returnNullIfPathNotExists 为 true 则不会报错,会返回 null。

5)更新数据

void writeData(String path,Object data)
void writeData(final String path,Object data,final int expectedVersion)

6)检测节点是否存在

boolean exists(final String path)

三、zkClient的事件监听机制

在原生Zk API中,提供了watcher的机制监听节点,而zkClient将之转换成Listener的概念,就是订阅服务端的事件,从而我们只要实现IZkChildListener 接口相应的方法就能够对事件进行处理。

订阅/取消订阅节点子变化事件

public List subscribeChildChanges(String path, IZkChildListener listener)
public void unsubscribeChildChanges(String path, IZkChildListener childListener)

订阅/取消订阅数据变化事件

public void subscribeDataChanges(String path, IZkDataListener listener)
public void unsubscribeDataChanges(String path, IZkDataListener dataListener)

订阅/取消订阅连接状态变化事件

public void subscribeStateChanges(final IZkStateListener listener)
public void unsubscribeStateChanges(IZkStateListener stateListener)

取消所有订阅事件

public void unsubscribeAll()

文章永久链接:https://tech.souyunku.com/24802

未经允许不得转载:搜云库技术团队 » zkclient的使用

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们