zookeepeer使用java api
一、引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
二、测试API
1、测试Zookeeper的获取数据的功能
/**
* 测试Zookeeper的获取数据的功能
* @author 西门吹牛
* @throws Exception
* PS:在其中一台服务器断开的时候,这个用例是跑不过的
*/
@Test
public void getDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=new Stat();
byte[] bytes=zk.getData("/root",null,stat);
System.out.println("path:"+new String(bytes));
}
2、创建路径
/**
* 创建路径
* @throws Exception
* PS:临时性节点不能有孩子
* acl:access control list访问控制列表
* PERSISTENT 持久化节点,不会被删除
* PERSISTENT_SEQUENTIAL 持久化节点,名称会追加一个单调递增的数字
* EPHEMERAL 临时节点,session丢失后会删除
* EPHEMERAL_SEQUENTIAL 临时节点,名称会追加一个单调递增的数字
*/
@Test
public void createPathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
String strPath= zk.create("/root/sxl_node","sxl_node_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("path"+strPath);
}
3、删除路径
/**
* 删除路径
* @throws Exception
*/
@Test
public void deletePathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
//version等价于数据库的乐观锁
zk.delete("/root/sxl_node",0);
}
4、设置数据
/**
* 设置数据
* @throws Exception
* 运行之前要去查一下数据版本,每次跑一次,数据版本会加1,这里写的是1
*/
@Test
public void setDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=zk.setData("/root","new_data".getBytes(),1);
System.out.println("stat_version:"+stat.getVersion());
}
5、获取孩子节点
/**
* 获取孩子节点
* @throws Exception
*/
@Test
public void getChildren() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
List<String> nodeList=zk.getChildren("/",null);
for(String node:nodeList){
System.out.println("node:"+node);
}
}
三、注册观察者
我们注册观察者的目的是为了捕获集群的事件,当我们注册了观察者之后,集群发生事件就会发生回调。
1、回调函数是one time trigger(一次性触发)
/**
* 观察者模式
* @throws Exception
*/
@Test
public void watcherTest() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
//注意:
// 1.这里只会输出hello,并不会打印"有事情发生"这句话
// 2.但是这不意味着回调函数没有起作用,而是回调函数(实际是在后台开一个线程)还没有机会打印的时候,程序已经运行完成了,可以跟watcherTest2单元测试比较来看
System.out.println("hello");
}
/**
* 观察者模式2
* @throws Exception
*/
@Test
public void watcherTest2() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Thread.sleep(5000);
System.out.println("hello");
}
/**
* 观察者模式3
* @throws Exception
* 这里只会打印一次有事情发生,因为zookeeper的事情发生是一次性触发(one time trigger)
*/
@Test
public void watcherTest3() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Stat stat=zk.setData("/root","root_new_data".getBytes(),2); while (true) {
Thread.sleep(5000);
}
}
2、通过回调函数来获取数据变化的事件
/**
* 观察者模式4
* @throws Exception
* 这里我们在获取数据的时候加了一个watcher,这样在数据变化的时候会回调这个watcher,我们就知道数据改变了
*/
@Test
public void watcherTest4() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
byte[] data=zk.getData("/root",watcher,null);
System.out.println("data:"+new String(data));
Stat stat=zk.setData("/root","root_new_data".getBytes(),3); while (true) {
Thread.sleep(5000);
}
}
zookeepeer使用java api的更多相关文章
- Atitit 图像处理 调用opencv 通过java api attilax总结
Atitit 图像处理 调用opencv 通过java api attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...
- 【分布式】Zookeeper使用--Java API
一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...
- Elasticsearch的CRUD:REST与Java API
CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...
- [转]HDFS中JAVA API的使用
HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...
- HDFS中JAVA API的使用
HDFS中JAVA API的使用 HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...
- java安全沙箱(四)之安全管理器及Java API
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
- Java api 入门教程 之 JAVA的Random类
在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...
- (转)Java API设计清单
转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...
- 【hadoop2.6.0】利用Hadoop的 Java API
Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...
随机推荐
- 转载------35岁开始转变的观念(干了这碗鸡汤再写代码保证没有bug)
作为一个标准的IT男,从一开始的一线开发,做到管理层,又因为喜爱开发,跳槽继续专注coding,一干就是10多年.有时候就想,这样一直学习,coding,如果能干到老也挺不错的! 不过生活的压力是不会 ...
- ubuntu12.0.4开启root用户登陆
1.命令:sudo passwd root 为root分配密码,按提示进行设置就好. 2.打开终端,输入以下命令: sudo -s 进入root账户下: cd /etc/lightdm g ...
- MFC更换画笔(画刷)颜色以及画眼睛(GDI画图)
MFC画眼睛 换画笔(画刷)颜色(参考链接:https://blog.csdn.net/sunxiving/article/details/51272001) 由于画笔一旦创建后就无法修改.所以要修改 ...
- 复杂的web---web中B/S网络架构
web中B/S网络架构 1:web中B/S网络架构 2:CDN工作机制和架构 3:负载均衡: B/S分别是浏览器/服务器,架构流程为: 当你访问网站的时候,浏览器发送各种请求给浏览器,服 ...
- ASP.NET Core 应用发布与部署指南
一.前言 本篇主要包含哪些内容? 将项目发布到本地目录 将项目传输到服务器并配置启动&开机自动启动 将Nginx作为访问入口,配置反向代理 本篇环境信息 开发环境: 用途 工具&版本 ...
- SQL Server中sys.syslogin中updatedate字段的浅析
在系统视图sys.syslogins中,有createdate与updatedate两个字段,分别表示创建登录名与更新登录名的日期,如果你用updatedate的值来判断一个登录名的权限是否被修改过, ...
- LINQ的求和 平均 最大 最小 分组 计数 等等
1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By按Categ ...
- python连接sqlserver数据库
1.准备工作 python3.6连接sqlserver数据库需要引入pymssql模块 pymssql官方:https://pypi.org/project/pymssql/ 没有安装的话需要: pi ...
- (转)Eclipse中快速输入System.out.println()的快捷键
https://blog.csdn.net/ShiMengRan107/article/details/73614417 善用 Eclipse 组合键,可以提高输入效率. Step1: Eclipse ...
- Linux 小知识翻译 - 「LDAP」
这次聊聊「LDAP」. LDAP是「Lightweight Directory Access Protocol」的所有,从名字上可以看出是协议的一种. LDAP是访问数据库(层次型数据库)的组件.管理 ...