Java调用Zookeeper的实现步骤
作者:blue星空 发布时间:2022-04-14 17:01:11
标签:Java,调用,Zookeeper
watch机制
Zookeeper watch是一种监听通知机制,可以随时监听一些数据的变化,从而实现数据的及时性。
Zookeeper所有的读操作getData(), getChildren()和 exists()都可以设置监听(watch)。【写操作则是不能设置监视点的。】
Watch的三个关键点:
一次有效:当设置监视的数据发生改变时,该监视事件会被发送到客户端,并且该监听将会停止,除非重启注册监听;
顺序保证:网络延迟或者其他因素可能导致不同的客户端在不同的时刻感知某一监视事件,但是不同的客户端所看到的一切具有一致的顺序;
可以监听数据和子节点:getData()和 exists()可以设置监听数据变化;getChildren 可以设置监听子节点变化;
常用API
/**
*构造器
* @param connectString 集群的IP:端口号;多个服务器时,中间用逗号分割
* @param sessionTimeout 超时时间,单位:毫秒
* @param watcher * ,监听节点变化
* @throws IOException
*/
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException
/**
*
* @param path 节点路径
* @param data 数据
* @param acl 访问控制列表
* @param createMode 节点类型
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException
/**
*
* @param path 节点路径
* @param watch *
* @return 所有的子节点的名称
* @throws KeeperException
* @throws InterruptedException
*/
public List<String> getChildren(String path, boolean watch) throws KeeperException, InterruptedException
/**
*
* @param path 节点路径
* @param watcher *
* @param stat 状态信息【可以为null】
* @return 节点数据的二进制数组【可以通过new String()转换成字符串信息】
* @throws KeeperException
* @throws InterruptedException
*/
public byte[] getData(String path, Watcher watcher, Stat stat) throws KeeperException, InterruptedException
/**
*
* @param path 节点路径
* @param watch *
* @param cb 回调函数
* @param ctx 上下文参数 ?【该参数不太理解,望知道的留言讲解,谢谢】
*/
public void getData(String path, boolean watch, AsyncCallback.DataCallback cb, Object ctx)
/**
*
* @param path 节点路径
* @param data 数据
* @param version 版本号【初始通常赋值为-1,每次更新会自动+1】
* @return 状态信息
* @throws KeeperException
* @throws InterruptedException
*/
public Stat setData(String path, byte[] data, int version) throws KeeperException, InterruptedException
/**
*如果Stat为null,则节点不存在
* @param path 节点路径
* @param watch *
* @return 状态信息
* @throws KeeperException
* @throws InterruptedException
*/
public Stat exists(String path, boolean watch) throws KeeperException, InterruptedException
/**
* 如果要删除的节点有子节点,会报错:KeeperException$NotEmptyException: KeeperErrorCode = Directory not empty for
* 如果节点不存在,会报错:KeeperException$NoNodeException: KeeperErrorCode = NoNode for
* @param path 节点路径
* @param version 版本号[version = -1 : 匹配所有的版本]
* @throws InterruptedException
* @throws KeeperException
*/
public void delete(String path, int version) throws InterruptedException, KeeperException
JAVA调用
初始化
try {
ZooKeeperzooKeeper = new ZooKeeper("172.23.34.13:2181", 15000, event -> {
if (event.getType() == Watcher.Event.EventType.None && event.getState() == Watcher.Event.KeeperState.SyncConnected) {
System.out.println("Connectted successful.");
}
});
} catch (IOException e) {
e.printStackTrace();
}
创建节点: create
@Test
public void create() throws KeeperException, InterruptedException {
//参数:1,节点路径; 2,要存储的数据; 3,节点的权限; 4,节点的类型
String nodePath = zooKeeper.create("/java/2183", "This is Java Node 2183.".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(nodePath);
}
获取子节点: ls
public void getChildren() throws KeeperException, InterruptedException {
List<String> children = zooKeeper.getChildren("/", true);
for (String child : children) {
System.out.println("child: "+child);
}
}
同步获取节点内容: get
@Test
public void getData() throws KeeperException, InterruptedException {
String path = "/java";
byte[] bytes = zooKeeper.getData(path, event -> {
if (event.getType() == Watcher.Event.EventType.NodeDataChanged && path.equals(event.getPath())) {
System.out.println("Date changed.");
}
}, null);
System.out.printf("The data of %s is : %s \n",path, new String(bytes));
}
异步获取节点内容: get
@Test
public void getDataAsync() {
String path = "/java";
zooKeeper.getData(path, false, new AsyncCallback.DataCallback() {
@Override
public void processResult(int i, String s, Object o, byte[] bytes, Stat stat) {
System.out.printf("The data of %s is : %s \n",path, new String(bytes));
}
},"1000");
//休眠20秒,查看响应结果
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
指定版本号更新数据:set
@Test
public void setData() throws KeeperException, InterruptedException {
Stat stat = zooKeeper.setData("/java", "This is from java.".getBytes(), -1);
//更新节点后,version会自动+1。故,返回值为0
System.out.println(stat.getAversion());
}
多线程下更新数据:set
@Test
public void setDataThread() throws KeeperException, InterruptedException {
String path = "/java";
Stat stat = new Stat();
//1,先获取节点的当前版本
zooKeeper.getData(path,false,stat);
//2,在当前版本的基础上修改节点内容
zooKeeper.setData(path, "This is from java.".getBytes(), stat.getVersion());
}
判断节点是否存在
@Test
public void exists() throws KeeperException, InterruptedException {
Stat stat = zooKeeper.exists("/java", false);
if (stat == null) {
System.out.println("Not Exists.");
}else {
System.out.println("Exists.");
}
}
删除节点
@Test
public void delete() throws KeeperException, InterruptedException {
//version = -1 : 匹配所有的版本
zooKeeper.delete("/java/2182", -1);
}
来源:https://www.cnblogs.com/BlueStarWei/p/15159294.html
0
投稿
猜你喜欢
- ArrayList类List集合的实例化:List<String> l = new ArrayList<String>
- Bean的自动装配自动装配说明自动装配是使用spring满足bean依赖的一种方法spring会在应用上下文中为某个bean寻找其依赖的be
- 由于我们在eclipse ee中把项目部署在web端经常会出现报404错误。原因为:404状态码是一种http状态码,其意思是: 所请求的页
- 以前一直接触.net相关的web开发,现在猛然使用javaWeb还是很不习惯,就连搭个框架也是第一次。一、谈谈项目架构一开始接触.net相关
- //计算字符串的MD5值 public string G
- 在Java世界中,AES、DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程。介绍
- 前台form 表单:设置method=post,enctype=multipart/form-data。struts2在原有的上传解析器继承
- nacos使用占位符${}进行参数配置的方法有的时候,我们的nacos会出现一个配置文件里,有多个配置项对应的值都是一样的,这个时候naco
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- 1,IDEA中Lombok作用数据库: 库 表 字段 对应的值 user表(id,name,age)实体对象pojo: 用来封装数据库中的数
- 简介JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。JSON Web Token 入门教程 这篇文章可以帮你了解
- 一、什么是代理?指为一个目标对象提供一个代理对象, 并由代理对象控制对目标对象的引用. 使用代理对象, 是为了在不修改目标对象的基础上,增强
- 想要在IntelliJ IDEA编辑器里面修改,新建Class文件或者jsp文件或者js文件时候文件头自带的Created by {User
- SpringMVC常用组件DispatcherServlet:前端控制器,不需要工程师开发,由框架提供作用:统一处理请求和响应,整个流程控制
- 网络中数据传输经常是xml或者json,现在做的一个项目之前调其他系统接口都是返回的xml格式,刚刚遇到一个返回json格式数据的接口,通过
- import java.awt.AlphaComposite;import java.awt.Color;import java.awt.F
- 1.概念a.是个二叉树(每个节点最多有两个子节点)b.对于这棵树中的节点的节点值左子树中的所有节点值 < 根节点 < 右子树的所
- 小程序获取手机号,后端JAVA解密流程代码微信官方文档获取手机号流程地址,先看下最好方便理解下面步骤实现思路,步骤如下1.前端需先调用官方w
- IDEA配置maven环境一、配置maven本地环境先参照以下博客进行maven的安装,配置IDEA 如何搭建maven 安装、下载、配置(
- 一、前言 高斯混合模型(Gaussian Mixture Model)简称GMM,是一种业界广泛使用的聚类算法。它是多个高斯分布函