Java--Zookeeper工具类代码

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 这篇记录连接和操作Zookeeper的工具类,方便以后创建项目时可以直接CV。

这篇记录连接和操作Zookeeper的工具类,方便以后创建项目时可以直接CV。

       其实和以前安装那篇文章学过的用原生API连接一个东西,不过这个更全面一些,不止是连接,还有关闭、创建节点、更改节点、查询节点等等功能。

直接上代码:

一、依赖

<!--https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.6.3</version></dependency>

二、工具类

packagecom.xing.studyboot.component.zookeeper;
importjava.io.IOException;
importjava.util.List;
importorg.apache.zookeeper.CreateMode;
importorg.apache.zookeeper.KeeperException;
importorg.apache.zookeeper.WatchedEvent;
importorg.apache.zookeeper.Watcher;
importorg.apache.zookeeper.ZooDefs.Ids;
importorg.apache.zookeeper.ZooKeeper;
importorg.apache.zookeeper.data.Stat;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
/*** zookeeper 工具类* @author abel**/publicclassZookeeperUtil {
privatestaticfinalLoggerlog=LoggerFactory.getLogger(ZookeeperUtil.class);
privatestaticZooKeeperzk=null;
/***  连接到zookeeper* @param zkHost 地址 127.0.0.1:2181* @param timeOut 超时时间。 单位:毫秒* @throws Exception */publicstaticvoidcreateConnection(StringzkHost, inttimeOut) {
try {
zk=newZooKeeper(zkHost, timeOut, newWatcher() {
// 监控所有被触发的事件publicvoidprocess(WatchedEventevent) {
System.out.println("连接成功,已经触发了"+event.getType() +"事件!");
                }
            });
        } catch (IOExceptione) {
log.error("zookeeper连接{}时异常,{}",zkHost,e);
        }
    }
/*** 关闭连接*/publicstaticbooleancloseConnection() {
try {
zk.close();
log.debug("关闭连接");
returntrue;
        } catch (InterruptedExceptione) {
e.printStackTrace();
returnfalse;
        }
    }
/*** 判断当前路径节点是否存在* @param nodePath 节点路径* @param watch 指定是否复用zookeeper中默认的Watcher。 值: true\false* @return Stat为zookeeper的一个对象,如果是空则说明不存在*/publicstaticStatisExists(StringnodePath,booleanwatch) {
Statstat=null;
try {
stat=zk.exists(nodePath, watch);
        } catch (Exceptione) {
log.error("判断节点{}是否存在异常,{}",nodePath,e);
        }
returnstat;
    }
/***  检测结点是否存在 并设置监听事件  * @param path* @param watcher  传入指定的三种监听类型: 创建,删除,更新* @return*/publicStatexists(Stringpath,Watcherwatcher){
Statstat=null;
try {
returnzk.exists(path,watcher);
        } catch (Exceptione) {
log.error("判断节点{}是否存在异常,{}",path,e);
        }
returnstat;
    }
/*** 创建节点和创建子节点的区别在于nodePath 创建节点 nodePath 为 "/nodeFather" 创建其子节点时 nodePath为"/nodeFather/nodeSon"*  1.CreateMode 取值   *  PERSISTENT:持久化,这个目录节点存储的数据不会丢失 *  PERSISTENT_SEQUENTIAL:顺序自动编号的目录节点,这种目录节点会根据当前已经存在的节点数自动加 1,然后返回给客户端已经成功创建的目录节点名; *  EPHEMERAL:临时目录节点,一旦创建这个节点的客户端与服务器端口也就是 session过期超时,这种节点会被自动删除 *  EPHEMERAL_SEQUENTIAL:临时自动编号节点 * @param nodePath* @param nodeData*/publicstaticbooleancreatNode(StringnodePath, StringnodeData) {
booleanres=true;
try {
zk.create(nodePath, nodeData.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
log.debug("创建节点{}成功,节点内容为:{}",nodePath,nodeData);
        } catch (KeeperExceptione) {
log.error("创建节点{}已经存在{}",nodePath,e);
res=false;
        } catch (InterruptedExceptione) {
log.error("节点{}创建失败{}",nodePath,e);
res=false;
        }
returnres;
    }
/*** 修改持久化节点* @param path 可以是子节点也可以是父节点路径* @param data 修改后的数据*/publicstaticbooleanupdateNode(Stringpath, StringmodifyNodeData){
try {
//zk的数据版本是从0开始计数的。如果客户端传入的是-1,则表示zk服务器需要基于最新的数据进行更新。如果对zk的数据节点的更新操作没有原子性要求则可以使用-1.//version参数指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败. 指定version为-1则忽略版本检查zk.setData(path, modifyNodeData.getBytes(), -1);
log.debug("更新节点"+path+"的数据为"+modifyNodeData);
returntrue;
        } catch (Exceptione) {
log.error("【修改持久化节点异常】{},{},{}",path,modifyNodeData,e);
returnfalse;
        }
    }
/*** 删除持久化节点* @param path 删除节点的路径,可以是父节点也可以是子节点*/publicstaticbooleandeleteNode(Stringpath){
try {
//version参数指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败. 指定version为-1则忽略版本检查zk.delete(path,-1);
log.debug("删除"+path+"节点成功");
returntrue;
        } catch (Exceptione) {
log.error("【删除持久化节点异常】{},{}",path,e);
returnfalse;
        }
    }
/*** 获取当前节点的子节点(不包含孙子节点)* @param path 父节点path*/publicstaticList<String>getChildren(Stringpath) throwsKeeperException, InterruptedException{
log.debug("获取节点{}的子节点",path);
returnzk.getChildren(path, false);
   }
/*** 获取指定节点的值* @param path 节点* @param watcher * @param* @return*/publicstaticStringgetNodeData(StringnodePath,Watcherwatcher){
try {
Stringstr=newString(zk.getData(nodePath, watcher, newStat()));
log.debug("节点{}内容为{}",nodePath,str);
returnstr;
       }catch (Exceptione){
log.error("【删除持久化节点异常】{},{}",nodePath,e);
return"";
       }
   }
/*** main测试使用* * @param args*/publicstaticvoidmain(String[] args) {
StringnodePath="/xing";
StringsonNodePath="/xing/son";
StringzkHost="localhost:2181";
inttimeOut=1000;
try {
createConnection(zkHost, timeOut);//创建连接creatNode(nodePath, "创建了一个节点");//创建节点getNodeData(nodePath,null);
if(isExists(nodePath,true)!=null){
System.out.println(nodePath+"节点存在");
           }else{
System.out.println(nodePath+"节点不存在");
           }
updateNode(nodePath, "我是父节点,updateNode一下");
creatNode(sonNodePath, "创建一个子节点");
getNodeData(sonNodePath,null);
getChildren(nodePath);
updateNode(sonNodePath, "我是子节点,updateNode一下");
deleteNode(sonNodePath);
deleteNode(nodePath);
closeConnection();
       } catch (Exceptione) {
e.printStackTrace();
       }
   }
}


总结:

       这是一个包含了连接关闭、增删改查等操作API的Zookeeper工具类。


END

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
4天前
|
Java 程序员 图形学
程序员教你用代码制作飞翔的小鸟--Java小游戏,正好拿去和给女神一起玩
《飞扬的小鸟》Java实现摘要:使用IntelliJ IDEA和JDK 16开发,包含小鸟类`Bird`,处理小鸟的位置、速度和碰撞检测。代码示例展示小鸟图像的加载、绘制与旋转。同时有`Music`类用于循环播放背景音乐。游戏运行时检查小鸟是否撞到地面、柱子或星星,并实现翅膀煽动效果。简单易懂,可直接复制使用。
|
4天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
17 10
|
4天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
13 1
|
4天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
8 0
|
4天前
|
Java
Java的取余如何编写代码
【5月更文挑战第9天】Java的取余如何编写代码
19 5
|
4天前
|
Java
代码实例演示Java字符串与输入流互转
代码实例演示Java字符串与输入流互转
|
4天前
|
存储 安全 Java
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
掌握8条泛型规则,打造优雅通用的Java代码
|
4天前
|
数据库连接
java+ssm+vue代码视频学习讲解
java+ssm+vue代码视频学习讲解
11 0
|
4天前
|
SQL 缓存 算法
优化你的Java代码:性能调优技巧
优化你的Java代码:性能调优技巧
16 0
|
4天前
|
Java 编译器 程序员
Java一分钟之第一行Java代码:输出"Hello, World!"
【5月更文挑战第7天】本文引导初学者编写运行第一个Java程序——打印&quot;Hello, World!&quot;,介绍基本代码结构及常见问题。包括语法错误(如缺少分号、缩进不规范)、编译运行问题(忘记编译、运行错误)和环境配置问题(JDK未安装、环境变量未设置)。建议检查语法、熟悉编译运行流程并正确安装配置JDK。通过实战演练,从编写到运行,迈出Java编程第一步。
20 0