ZkClient subscribeDataChanges 注意事项

由于zkClient创建连接的时候指定了默认的序列化类-new SerializableSerializer(),所以存储在节点上的值也是序列化后的字节数组,当使用zkCli.sh在控制台set /xxx/xx的值时,存储的是普通的字符串字节数组。当set值时虽然触发了值改变事件,但zkClient无法反序列化这个值。
要使zkCli.sh的值也能被zkClient读取必须通过实现ZkSerializer接口使用自定义的序列化类:

import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer;

import java.io.UnsupportedEncodingException;

public class CustomSerializer implements ZkSerializer {

    private String charset = "UTF-8";

    public CustomSerializer(){}

    public CustomSerializer(String charset){
        this.charset = charset;
    }
    public byte[] serialize(Object data) throws ZkMarshallingError {
        try{
            byte[] bytes = String.valueOf(data).getBytes(charset);
            return bytes;
        }catch (UnsupportedEncodingException e){
            throw new ZkMarshallingError("Wrong Charset:" + charset);
        }
    }

    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
        String result = null;
        try {
            result = new String(bytes,charset);
        } catch (UnsupportedEncodingException e) {
            throw new ZkMarshallingError("Wrong Charset:" + charset);
        }
        return result;
    }
}
public class App
{
    static final String CONNECT_ADDR = "10.0.0.1:2181,10.0.0.2:2181,10.0.0.3:2181";
    private static final String PARENT_PATH = "/lock";

    public static void main(String[] args) {

        ZkClient zkc = new ZkClient(CONNECT_ADDR,10000,10000,new CustomSerializer());


        zkc.subscribeDataChanges(PARENT_PATH, new IZkDataListener() {

            @Override
            public void handleDataDeleted(String path) throws Exception {
                System.out.println("subscribeDataChanges    handleDataDeleted");
                System.out.println("删除的节点为:" + path);
            }

            @Override
            public void handleDataChange(String path, Object data)
                    throws Exception {
                System.out.println("subscribeDataChanges    handleDataChange");
                System.out.println("变更的节点为:" + path + ", 变更内容为:" + data);
            }
        });

        try {
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }
        zkc.close();
    }
}

### 回答1: 以下是zkclient常用命令: 1. `ls`: 列出指定节点下的所有子节点。 ``` ls /path/to/node ``` 2. `create`: 创建一个新的节点。 ``` create /path/to/new/node "data" ``` 这将在指定的路径下创建一个新的节点,并将指定的数据写入到该节点中。 3. `get`: 获取指定节点的数据。 ``` get /path/to/node ``` 这将返回指定节点的数据。 4. `set`: 设置指定节点的数据。 ``` set /path/to/node "new data" ``` 这将更新指定节点的数据。 5. `delete`: 删除指定的节点。 ``` delete /path/to/node ``` 这将删除指定节点以及其所有子节点。 6. `stat`: 获取指定节点的状态信息。 ``` stat /path/to/node ``` 这将返回指定节点的状态信息,包括版本号、创建时间、修改时间等。 7. `quit`: 退出zkclient。 ``` quit ``` 这将关闭zkclient客户端。 ### 回答2: zkclient是一个Java客户端库,用于与ZooKeeper集群进行交互。它提供了一组常用的命令,方便开发人员与ZooKeeper进行交互和管理。 1.连接到ZooKeeper集群:zkclient可以使用`new ZkClient(connectionStr)`方法来创建与ZooKeeper集群的连接。其中,connectionStr是ZooKeeper集群的地址。 2.创建节点:可以使用`create(path, data, CreateMode)`方法在ZooKeeper集群中创建一个持久节点或临时节点。path表示节点的路径,data表示节点的数据,CreateMode表示节点的类型。 3.获取节点数据:使用`readData(path)`方法可以获取节点的数据。 4.设置节点数据:`writeData(path, data)`方法用于设置或更新节点的数据。 5.删除节点:`delete(path)`方法可以删除指定的节点。 6.判断节点是否存在:使用`exists(path)`方法可以判断指定的节点是否存在。 7.获取子节点列表:`getChildren(path)`方法可以获取指定节点的子节点列表。 8.使用监听器:可以使用`subscribeDataChanges(path, IZkDataListener)`和`subscribeChildChanges(path, IZkChildListener)`方法来注册节点数据和子节点变化的监听器,实现对节点的监控。 这是zkclient常用的一些命令,通过这些命令可以完成对ZooKeeper集群的基本操作和管理。使用zkclient可以方便地与ZooKeeper进行交互,并通过监听器实现对节点的动态监控。 ### 回答3: ZkClient是一个针对ZooKeeper的Java客户端库,提供了一些常用的命令来操作ZooKeeper。 1. 创建节点:使用create()命令可以在ZooKeeper中创建一个节点。例如,create("/path", "data")可以创建一个路径为"/path"的节点,并将其数据设置为"data"。 2. 获取节点数据:使用readData()命令可以读取指定节点的数据。例如,readData("/path")可以获取路径为"/path"的节点的数据。 3. 更新节点数据:使用writeData()命令可以更新指定节点的数据。例如,writeData("/path", "newData")可以将路径为"/path"的节点的数据更新为"newData"。 4. 删除节点:使用delete()命令可以删除指定节点。例如,delete("/path")可以删除路径为"/path"的节点。 5. 检查节点是否存在:使用exists()命令可以检查指定节点是否存在。例如,exists("/path")可以检查路径为"/path"的节点是否存在。 6. 获取子节点列表:使用getChildren()命令可以获取指定节点的子节点列表。例如,getChildren("/path")可以获取路径为"/path"的节点的子节点列表。 7. 创建临时节点:使用createEphemeral()命令可以创建一个临时节点。临时节点在客户端与ZooKeeper断开连接时会被自动删除。 以上就是一些zkclient常用的命令,通过使用这些命令可以方便地对ZooKeeper进行节点的创建、读取、更新和删除等操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值