当前位置: 首页 > news >正文

java连接zookeeper

API

ZooKeeper官方提供了Java API,可以通过Java代码来连接zookeeper服务进行操作。可以连接、创建节点、获取节点数据、监听节点变化等操作,具体有以下几个重要的类:

  1. ZooKeeper:ZooKeeper类是Java API的核心类,用于与ZooKeeper服务器建立连接,并提供了一系列方法来操作ZooKeeper的节点。
  2. Watcher:Watcher是ZooKeeper的一个回调接口,当节点发生变化时会调用相应的方法进行通知。
  3. CreateMode:CreateMode枚举类定义了节点的类型,包括永久节点、临时节点、顺序节点和临时顺序节点。
  4. Stat:Stat类表示节点的元数据信息,比如修改版本、数据长度、子节点数量等。

添加依赖

<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.7.2</version>
</dependency>

操作例子

String host = "localhost:2181";
//建立连接
zooKeeper = new ZooKeeper(host, 2000, null);
String path = "/test";
Watcher watcher = new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {System.out.println("Node changed: " + watchedEvent.getPath());System.out.println(watchedEvent);}
};
//获取节点状态 如果不存在返回null
Stat stat = zooKeeper.exists(path, false);
if(null != stat){System.out.println(stat.getCzxid()+"-"+stat.getAversion());
}//创建节点 包含版本、时间、数据长度等信息
zooKeeper.create(path,"123".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//添加watcher
zooKeeper.addWatch(path, watcher, AddWatchMode.PERSISTENT);//获取节点数据
byte[] data = zooKeeper.getData(path, false, null);
System.out.println(new String(data));zooKeeper.create(path+"/1","child1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//获取子节点
List<String> children = zooKeeper.getChildren(path, false);
System.out.println("childs size:"+children.size());
//删除子节点
zooKeeper.delete(path+"/1",-1);
zooKeeper.close();
zkClient

zkClient封装了zookeeper的官方api,简化了一些繁琐的操作,并提供了一些额外的功能,提高了开发效.

添加依赖

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

zkclient对节点数据的操作进行了序列化, 这里先准备一个string类型的序列化类。需要实现ZkSerializer接口

public class ZkStringSerializer implements ZkSerializer {@Overridepublic byte[] serialize(Object o) throws ZkMarshallingError {return String.valueOf(o).getBytes();}@Overridepublic Object deserialize(byte[] bytes) throws ZkMarshallingError {return new String(bytes);}
}

基本操作

ZkClient zkClient = new ZkClient("localhost:2181");
//自定义序列化 否则报错
zkClient.setZkSerializer(new ZkStringSerializer());
String path = "/test";
//判断节点是否存在
boolean exist = zkClient.exists(path);
System.out.println(exist);
if(!exist){//创建节点zkClient.create(path,"123", CreateMode.PERSISTENT);
}
//读取节点数据
System.out.println((String) zkClient.readData(path));
zkClient.writeData(path,"456");//设置节点数据
System.out.println((String) zkClient.readData(path));
zkClient.delete(path);//删除节点zkClient.close();

节点变化事件

String path = "/test";
/*** 节点变化事件* 只监听节点增减,不监听数据变化事件*/
zkClient.subscribeChildChanges(path, new IZkChildListener() {@Overridepublic void handleChildChange(String parentPath, List<String> children) throws Exception {System.out.println("节点"+parentPath+"发生变化");System.out.println(children);}
});
//节点操作,观察handleChildChange接收到对应事件
Thread.sleep(2000);
zkClient.createPersistent(path);
Thread.sleep(2000);
zkClient.createPersistent(path+"/child1");
Thread.sleep(2000);
zkClient.writeData(path+"/child1","123");
Thread.sleep(2000);
zkClient.delete(path+"/child1");
Thread.sleep(2000);
zkClient.delete(path);
Thread.sleep(100000);

节点数据变化事件

    String path = "/test";/*** 节点变化事件,只检测当前节点,感知不到其子节点* 节点被删除或节点数据变化*/zkClient.subscribeDataChanges(path, new IZkDataListener() {@Overridepublic void handleDataChange(String s, Object o) throws Exception {System.out.println("节点:"+s+"数据变为:"+o);}@Overridepublic void handleDataDeleted(String s) throws Exception {System.out.println("节点:"+s+"删除");}});Thread.sleep(2000);zkClient.createPersistent(path);Thread.sleep(2000);zkClient.createPersistent(path+"/child1");Thread.sleep(2000);zkClient.delete(path+"/child1");Thread.sleep(2000);zkClient.writeData(path,"123");Thread.sleep(2000);zkClient.delete(path);Thread.sleep(100000);
}

Curator

curator是另一个java连接zookeeper类库。功能更加强大。提供了连接重试、分布式锁、选举、队列等多种实际场景的用例。这里先简单搞个使用例子。

添加依赖

<dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>5.1.0</version>
</dependency>

curator-framework是基础的依赖,一些特定的使用方式需要添加不同的依赖,有curator-recipes、curator-x-discovery、curator-x-async等。

基本操作

//创建连接
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
String path = "/test";
client.checkExists().forPath(path);//判断是否存在
client.create().forPath(path, "123".getBytes());//创建节点
byte[] data = client.getData().forPath(path);//获取数据
System.out.println(new String(data));
client.setData().forPath(path, "456".getBytes());//设置数据
client.delete().forPath(path);//删除节点client.close();

节点监听

CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
String path = "/test";
NodeCache  nodeCache = new NodeCache(client,path);
//添加监听
nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {ChildData data = nodeCache.getCurrentData();if (data != null) {System.out.println("Node changed: " + data.getPath() + ", value: " + new String(data.getData()));} else {System.out.println("Node deleted: " + nodeCache.getPath());}}
});
nodeCache.start();
client.create().forPath(path);
client.setData().forPath(path, "123".getBytes());
client.delete().forPath(path);
client.close();

这里NodeCache被标识@Deprecated,也不知道被什么方式代替了,后面再研究。先简单使用。

相关文章:

java连接zookeeper

API ZooKeeper官方提供了Java API&#xff0c;可以通过Java代码来连接zookeeper服务进行操作。可以连接、创建节点、获取节点数据、监听节点变化等操作&#xff0c;具体有以下几个重要的类&#xff1a; ZooKeeper&#xff1a;ZooKeeper类是Java API的核心类&#xff0c;用于与…...

2023-11-01 node.js-electron-环境配置-记录

摘要: 2023-11-01 node.js-electron-环境配置-记录 相关文档: Node.js Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron node.js的国内源 - Python技术站 node.js 下载地址: https://nodejs.org/dist/v20.9.0/ 说明: 最好使用最新版本当前我使…...

使用 ElementUI 组件构建 Window 桌面应用探索与实践(WinForm)

零、实现原理与应用案例设计 1、原理 基础实例 Demo 可以参照以下这篇博文&#xff0c; 基于.Net CEF 实现 Vue 等前端技术栈构建 Windows 窗体应用-CSDN博客文章浏览阅读291次。基于 .Net CEF 库&#xff0c;能够使用 Vue 等前端技术栈构建 Windows 窗体应用https://blog.c…...

使用C++构建安全队列

1 背景 STL的容器不是线程安全的&#xff0c;我们经常会有需求要求数据结构线程安全&#xff0c;比如写生产者消费者模型的时候&#xff0c;就要求队列线程安全。利用std::queue和C线程标准库的一些组件&#xff08;mutex&#xff0c;condition_variable&#xff09;&#xff…...

EasyFlash移植使用- 关于单片机 BootLoader和APP均使用的情况

目前&#xff0c;我的STM32单片机&#xff0c;需要在BootLoader和APP均移植使用EasyFlash&#xff0c;用于参数管理和IAP升级使用。 但是由于Flash和RAM限制&#xff0c;减少Flash占用&#xff0c;我规划如下&#xff1a; BootLoader中移植EasyFlash使用旧版本&#xff0c;因为…...

python捕获异常和scapy模块的利用

Python捕获异常 ​ 当程序运行时&#xff0c;因为遇到未知的错误而导致中止运行&#xff0c;便会出现Traceback 消息&#xff0c;打印异常。异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响程序的正常执行。一般情况下&#xff0c;在Python 无法正…...

CSS+Javascript+Html日历控件

最近&#xff0c;因需要用HTMLJAVASCRIPTCSS实现了一个日历控件&#xff0c;效果如下&#xff1a; 单击上月、下月进行日历切换。当前日期在日历中变颜色标注显示。还是老老套路、老方法&#xff0c;分HMLCSSJAVASCRIPT三部分代码。 一、html代码 <h1>学习计划</h1…...

让企业的数据用起来,数据中台=数据治理?

加gzh“大数据食铁兽”&#xff0c;了解更多数据治理信息。 先说结论&#xff1a;数据中台是数据管理/治理的工具之一&#xff0c;数据治理是3分技术7分管理及运营。 数据中台的定义&#xff1a; 狭义的数据中台指在企业内部通过对数据半成品、算法、模型、工具等能力的积累&a…...

【人工智能Ⅰ】5-粒子群算法

【人工智能Ⅰ】5-粒子群算法 文章目录 【人工智能Ⅰ】5-粒子群算法5.1 粒子群算法PSO基本思想5.2 PSO介绍5.3 PSO求最优解5.4 算法流程5.5 PSO构成要素群体大小m权重因子最大速度Vm停止准则粒子空间的初始化领域的拓扑结构 5.6 PSO应用5.7 PSO改进动态调整惯性权重收缩因子法 5…...

软考高项-49个项目管理过程输入、输出和工具技术表

知识领域数量五大过程组启动规划执行监控收尾整体7制订项目章程制订项目管理计划指导与管理项目工作 管理项目知识 监控项目工作 实施整体变更控制 结束项目或阶段范围6规划范围管理 收集需求 定义范围 创建WBS 确认范围 控制范围 进度6规划进度管理 定义活动...

《C和指针》(7)函数

问题 具有空函数体的函数可以作为存根使用。你如何对这类函数进行修改&#xff0c;使其更加有用&#xff1f; 答&#xff1a;当存根函数被调用时&#xff0c;打印一条消息&#xff0c;显示它已被调用&#xff0c;或者也可以打印作为参数传递给它的值。 .如果在一个函数的声明中…...

vue3中的Props

Props声明 一个组件需要显示声明它所接受的props&#xff0c;这样vue才能知道外部传入的哪些是props&#xff0c;哪些是透传attribute 在使script setup的单文件中&#xff0c;props可以使用 defineProps()宏来声明&#xff1a; <script setup> const props definePro…...

ElasticSearch搜索技术深入与聚合查询实战

ES分词器详解 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 分词发生时…...

vue+element ui中的el-button自定义icon图标

实现 button的icon属性自定义一个图标名称&#xff0c;这个自定义的图标名称会默认添加到button下i标签的class上&#xff0c;我们只需要设置i标签的样式就可以了 ##3. 按钮上使用自定义的icon 完整代码 <div class"lookBtn"><el-button icon"el-icon-…...

PyQt5:构建目标检测算法GUI界面 (附python代码)

文章目录 1.界面2.代码3.Analyze 1.界面 目标检测算法一般就是检测个图片&#xff0c;然后显示图片结果。 最简单的情况&#xff0c;我们需要一个按钮读取图片&#xff0c;然后后有一个地方显示图片。 2.代码 import sys import numpy as np from PIL import Imagefrom PyQt…...

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 &#xff08;4G版&#xff09; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介&#xff1a; 通过局域网/广域网网组网的网络报警系统&#xff0c;改变传统局域网组网…...

对xml文本元素赋值

public static void main(String[] args) {Map map ....;//数据Iterator it doc.getRootElement().elementIterator();//doc是xml模板//将元素ID与输入框的值放在map中while (it.hasNext()) {org.dom4j.Element nextRoot (org.dom4j.Element) it.next();Iterator nextIt ne…...

【k8s】资源管理命令-陈述式

一、资源管理介绍 1、资源管理概念 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通过操作资源来管理kubernetes。 //kubernetes的本质就是一个集群系统&#xff0c;用户可以在集群中部署各种服务&#xff0c;起始就是在kubernetes集群中运行一个个…...

无需频繁登录支付宝网站即可完成商家转账,实时到账,方便安全快捷

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…...

Vue 监听属性 watchEffect

watchEffect 函数&#xff1a;自动收集依赖源&#xff0c;不用指定监听哪个数据&#xff0c;在监听的回调中用到哪个数据&#xff0c;就监听哪个数据。 而 watch 函数&#xff1a;既要指定监听的数据&#xff0c;也要指定监听的回调。 watchEffect 函数&#xff1a;类似于 co…...

如何用Synonyms实现智能问答系统:面向初学者的完整指南

如何用Synonyms实现智能问答系统&#xff1a;面向初学者的完整指南 【免费下载链接】Synonyms :herb: 中文近义词&#xff1a;聊天机器人&#xff0c;智能问答工具包 项目地址: https://gitcode.com/gh_mirrors/sy/Synonyms Synonyms是一个强大的中文近义词工具包&#…...

PHP Tokenizer终极指南:5个企业级代码分析实战案例

PHP Tokenizer终极指南&#xff1a;5个企业级代码分析实战案例 【免费下载链接】tokenizer A small library for converting tokenized PHP source code into XML (and potentially other formats) 项目地址: https://gitcode.com/gh_mirrors/to/tokenizer PHP Tokenize…...

终极跨平台游戏优化工具迁移指南:从Windows到Linux/macOS的完整解决方案

终极跨平台游戏优化工具迁移指南&#xff1a;从Windows到Linux/macOS的完整解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款强大的游戏优化工具&#xff0c;专为管理NVIDIA DLSS、AMD FSR和…...

GDScriptDecomp源码编译指南:从零构建自定义逆向工程工具

GDScriptDecomp源码编译指南&#xff1a;从零构建自定义逆向工程工具 【免费下载链接】gdsdecomp Godot reverse engineering tools 项目地址: https://gitcode.com/GitHub_Trending/gd/gdsdecomp GDScriptDecomp是一款强大的Godot逆向工程工具&#xff0c;它能够帮助开…...

双向buck-boost电路仿真模型-储能双向DCDC变换器 电压电流双闭环PI控制 蓄电池充放电模式可切换 恒流充电_恒压输出 Matlab_Simulink模型

双向buck-boost电路仿真模型-储能双向DCDC变换器 电压电流双闭环PI控制 蓄电池充放电模式可切换 恒流充电/恒压输出 Matlab/Simulink模型核心控制算法&#xff1a;双闭环 PI 控制器 (MATLAB Function/S-Function) 这是模型的“大脑”。它需要根据模式切换&#xff0c;决定是外环…...

OpenClaw自动化写作:Qwen2.5-VL-7B生成图文并茂技术文档

OpenClaw自动化写作&#xff1a;Qwen2.5-VL-7B生成图文并茂技术文档 1. 为什么需要自动化技术文档写作 作为一个经常需要编写技术文档的开发者&#xff0c;我深知文档写作的痛点。每次完成一个功能模块后&#xff0c;总要花大量时间整理代码片段、截图、编写说明文字。最麻烦的…...

西门子PLC与多台变频器Modbus RTU通讯控制:模拟量转换、温度压力PID控制及KTP7...

西门子PLc程序&#xff0c;博途V16 V17版1200与多台G120变频器通过过modbus RTU485 通讯控制&#xff0c;模拟量转换&#xff0c;温度转换&#xff0c;压力Pid控制&#xff0c;西门子KTP700 HMi 含电路图&#xff0c;G120变频器报文最近在车间折腾西门子1200PLC和G120变频器…...

从调参到API调用:算法岗这些年经历了什么

你这个问题&#xff0c;我先给个结论&#xff0c;一个可能会让你有点意外但绝对是现实的结论&#xff1a;你遇到的情况&#xff0c;不是特例&#xff0c;而是正在迅速成为行业的主流和新常态。你实习干的活&#xff0c;很有可能就是未来几年大多数“AI工程师”或者“算法工程师…...

Shell_命令语法、管道和重定向详细介绍

Shell 命令语法、管道和重定向详细介绍 一、Shell 命令基本语法 1.1 命令结构 命令 [选项] [参数]命令&#xff1a;要执行的程序选项&#xff1a;修改命令行为的标志&#xff08;通常以 - 或 -- 开头&#xff09;参数&#xff1a;命令操作的对象 示例&#xff1a; ls-l /ho…...

鸿蒙应用对接DeepSeek大模型:构建智能问答系统的技术实践

鸿蒙应用对接DeepSeek大模型&#xff1a;构建智能问答系统的技术实践 随着鸿蒙系统&#xff08;HarmonyOS&#xff09;在全场景智能终端的深度布局&#xff0c;以及AI大模型技术的快速迭代&#xff0c;将鸿蒙原生应用与DeepSeek大模型深度融合&#xff0c;已成为打造智能问答系…...