zookeeper客户端目前社区中比较多,而且大家在使用zookeeper时或多或少都会自己"重复发明轮子";事实上apache zookeeper API也已经足够完善,我们自己封装client也是非常简单的工作;其实大家封装client,无外乎就是调整一些非常基本的功能.我们看看I0Itec能否满足我们的需要.
I0Itec-zkClient并不是一个非常大众化的工具,也没有提供完美的功能列表;不过它的简单和易用性对我们的一些常规应用,似乎已经足够了.I0Itec特性一览:
1) 提供了zookeeper断链重连的特性------这个特性似乎每个开发者都会设计,而且代码风格几乎"如出一辙"..在大部分zookeeper使用场景中,我们都要求它能够在断链的时候,重新建立连接,无论session失效与否.
2) 便捷的event监听器机制-------向ZNODE节点注册watch,每个开发者都使用过,尽管watch机制并不能确保数据变更的实时性..watch-event属于"即发即失",因为我们需要得到event时候,再去注册一遍,这也是一个非常繁琐的事情,I0Itec-zkClient提供了event-listener的小技巧,可以帮助我们"解脱".
3) zookeeper异常处理-------zookeeper中繁多的Exception,以及每个Exception所需要关注的事情各有不同,你应该记得那一堆try-catch给你带来的烦恼;I0Itec简单的做了封装.
4) data序列化------简单的data序列化.(Serialzer/Deserialzer)
I0Itec-zkClient API
- ZkConnection类: 对zookeeper API的简单分装,提供了链接zookeeper server和数据CRUD的操作;此类实现了IZkConnection接口,通常情况下,如果I0Itec-zkclient不能满足需要的时候,我们可以重写ZkConnection即可.
- ZkClient类: 核心类,也是开发者需要直接使用的类,它内部维护了zookeeper的链接管理和Event处理逻辑等,同时也暴露了zookeeper znode的CRUD方法列表.
- IZkChildListener接口: znode 子节点事件侦听器,当ZkClient接收到某个path节点变更或者子节点变更事件时,会触发lisntener.
- IZkDataListener接口:
- IZkStateListener接口: 当zookeeper客户端状态变更时,触发.
I0Itect-zkClient暂时有几个方法需要重写:
1) create方法:创建节点时,如果节点已经存在,仍然抛出NodeExistException,可是我期望它不在抛出此异常.
2) retryUtilConnected: 如果向zookeeper请求数据时(create,delete,setData等),此时链接不可用,那么调用者将会被阻塞直到链接建立成功;不过我仍然需要一些方法是非阻塞的,如果链接不可用,则抛出异常,或者直接返回.
3) create方法: 创建节点时,如果节点的父节点不存在,我期望同时也要创建父节点,而不是抛出异常.
4) data监测: 我需要提供一个额外的功能来补充watch的不足,开启一个线程,间歇性的去zk server获取指定的path的data,并缓存起来..归因与watch可能丢失,以及它不能持续的反应znode数据的每一次变化,所以只能手动去同步获取.
I0Itect编程实践:
1.pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.7.RELEASE</version> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.5</version> <exclusions> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.4</version> </dependency>
2.Java
ZkClient zkClient = new ZkClient("192.168.0.121:2181",3000); zkClient.subscribeChildChanges("/worker",new IZkChildListener() { @Override public void handleChildChange(String parentPath, List<String> children) throws Exception { if(children == null){ System.out.println("<" + parentPath + "> is deleted"); return; } for(String child : children){ System.out.println("<Child>:" + child); } } });
简单易用,值得试用.
相关推荐
广东工业大学的iTeC团队在这次竞赛中提交了技术报告,主要讲述了他们如何使用CCD相机作为传感器,自动追踪黑线进行无人驾驶的技术实现。 首先,报告提到了智能汽车的典型机电一体化产品特点,即产品设计涉及到机械...
ITEC-621-项目为ITEC 621项目构建的简单回购。 可提供2个Google文档: //docs.google.com/document/d/1XTdTYpejjMYebzhQB11MH_vgtA60Ni817nMxnzeh5xY/edit usp sharing可提供2个附录google doc: ://docs.google....
【标题】"ITEC-2560-90-Lab-7" 是一个与IT教育相关的实验室项目,可能属于某个课程或学习计划的一部分。这个实验室的编号表明它可能是课程ITEC-2560中的第90次实验,重点是编程语言JavaScript。 【描述】虽然"ITEC-...
2015 Spring - ITEC 335 - 软件测试 关于这个项目 这是我的 Spring 2015 ITEC 335 软件测试课程的源代码库。 课程中完成的大部分工作包括 BlueJ 和 Eclipse 项目。 关于作者 我是 David Ball,IT 专业和软件工程专业...
《深入理解ITEC-3020:CSS技术解析与实战应用》 在信息技术领域,ITEC-3020通常被用作一个课程代码,代表着某个特定的IT教育课程。在这个课程中,核心主题是CSS(Cascading Style Sheets),这是一种用于描述HTML或...
import org.I0Itec.zkclient.ZkClient; //...其他导入 public class Agent { private ZkClient zkClient; private static final String rootPath = "/tuling-manger"; private static final String servicePath...
《国际空间站地图——深入解析ITEC2560-Assignment6-ISSMap.html》 在信息技术领域,HTML(超文本标记语言)是构建网页内容的基础。本篇将围绕"ITEC2560-Assignment6-ISSMap.html"这一主题,深入探讨如何使用HTML来...
itec325-项目 团队成员:-迈克尔·戴维斯(Michael Davis)-布兰登·沃尔夫(Brandon Wolfe)-阿什莉·迪克森(Ashley Dickerson) 项目描述: 一个基于位置的Web应用程序,它将帮助用户找到吃饭的地方。我们的应用...
由于提供的标签为空,我们无法直接获取特定的技术栈信息,但我们可以从"demo-itec-main"这个压缩包子文件名推断,它可能包含项目的主代码库或者主要模块。 在IT行业中,一个演示项目可能涵盖以下知识点: 1. **...
ITEC334页面主要涉及的是HTML(HyperText Markup Language)这一核心的网页制作语言,它是构建互联网上大部分内容的基础。HTML允许开发者通过结构化的标签来组织文本、图像和其他多媒体资源,创建出交互式的网页。在...
ITEC3020是一个可能代表大学课程代码的标识,暗示这个压缩包是为学习或教学ITEC3020课程的学生和教师准备的资源集合。这个仓库包含了该课程的所有任务,意味着它可能涵盖了一系列的项目、作业、实验或者实践活动,...
在充电状态期间,使用 5 级恒流控制作为充电时间,发现多 (5) 级恒流控制 (MSCCC) 的充电优于恒流恒压方法(参考文件: https://doi. org/10.1109/ITEC-AP.2016.7512982 ) 直流负载电压在充电和放电阶段均设置为...
itec3860_social - ITEC 3860 的代码社交指示分叉存储库添加上游作为新的远程仓库: git remote add upstream https://github.com/ggc-itec/itec3860_social.git 确保遥控器设置正确: git remote -v 添加带有您的...
import org.I0Itec.zkclient.ZkClient import org.apache.spark.SparkConf import org.apache.spark.streaming.dstream.{DStream, InputDStream} import org.apache.spark.streaming.kafka.{HasOffsetRanges, ...
嵌入式车道控制机是高速公路收费站自动化的核心设备,主要由ELC-14482-A型车道控制机和ITEC-D14482-A型工控机组成,配合EN-ELC-31型车道机柜共同运作。工控机作为控制中心,运行车道收费软件,管理各种外围设备,...
【ITEC225】是一门信息技术相关的课程,可能涵盖了计算机科学、软件工程、网络技术等多个方面的内容。虽然没有提供具体的描述和标签,但我们可以基于常见的IT课程结构来推测这门课程可能涉及的关键知识点。 首先,...
itec3020 ITEC 3020的Web设计在本次作业中,要求您使用适当HTML和CSS在网上商店中创建产品页面。 使用CSS来吸引用户的方式来样式化您的网站非常重要。 您的作业应包括: 在开始制作网页之前制作的网页草图一个index....
1. 嵌入式车道控制机型号为ELC-14482-A,工控机型号为ITEC-D14482-A,两者构成了车道控制的核心。 2. 车道机柜(EN-ELC-31)用于容纳工控机并承载收费车道的强弱电接入及控制信号传递。 3. 车道外围设备包括视频设备...
itec225 我的itec225类公共文件此存储库专门用于保存我们的讲师Freeman lo提供的文件:github / freemanbach