(原) 2.1 Zookeeper原生API使用
本文为原创文章,转载请注明出处,谢谢
Zookeeper原生API使用
1、jar包引入,演示版本为3.4.6,非maven项目,可以下载jar包导入到项目中
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
2、创建zookeeper连接
ZooKeeper(java.lang.String connectString, int sessionTimeout, org.apache.zookeeper.Watcher watcher)
- connectString:zookeeper服务地址,例如“192.168.117.128:2181”
- sessionTimeout :超时时间,单位为毫秒
- watcher:实现org.apache.zookeeper.Watcher接口的实现类,需实现process(WatchedEvent watchedEvent) 方法
ZooKeeper zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new MyWatcher());
示例代码:
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException; /**
*
* zookeeper连接
*/
public class CreateSession implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
System.out.println("做业务!");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSession());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ps:此处没有新创建新的java类实现Watcher,而是直接在本类中实现Watcher接口并重写process方法
3、同步创建
create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl, org.apache.zookeeper.CreateMode createMode)
- path:创建节点路径,需保证父节点已存在
- data:节点数据
- acl:权限列表
- 提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE
- OPEN_ACL_UNSAFE:完全开放
- CREATOR_ALL_ACL:创建该znode的连接拥有所有权限
- READ_ACL_UNSAFE:所有的客户端都可读
- 自定义权限
ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass"))); - session设置权限
zk.addAuthInfo("digest", "id:pass".getBytes());
- 提供默认的权限OPEN_ACL_UNSAFE、CREATOR_ALL_ACL、READ_ACL_UNSAFE
- createMode:节点类型
- PERSISTENT:持久化节点
- PERSISTENT_SEQUENTIAL:持久化有序节点
- EPHEMERAL:临时节点(连接断开自动删除)
- EPHEMERAL_SEQUENTIAL:临时有序节点(连接断开自动删除)
示例代码:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider; import java.io.IOException;
import java.security.NoSuchAlgorithmException; /**
* 创建节点(同步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionSync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
try {
if(null != zooKeeper.exists("/note_scot/note_scot_a",false)) {
System.out.println("/note_scot/note_scot_a 节点已存在");
return;
}
String path = zooKeeper.create("/note_scot/note_scot_a","aa".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); /*权限相关
try {
ACL aclIp = new ACL(ZooDefs.Perms.READ,new Id("ip","127.0.0.1"));
ACL aclDigest = new ACL(ZooDefs.Perms.READ| ZooDefs.Perms.WRITE,
new Id("digest", DigestAuthenticationProvider.generateDigest("id:pass")));
zooKeeper.addAuthInfo("digest", "id:pass".getBytes());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}*/ System.out.println("zookeeper return:" + path);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionSync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
4、异步创建
create(java.lang.String path, byte[] data, java.util.List<org.apache.zookeeper.data.ACL> acl,
org.apache.zookeeper.CreateMode createMode, org.apache.zookeeper.AsyncCallback.StringCallback cb, java.lang.Object ctx)
- StringCallback cb:回调接口,执行创建操作后,结果以及数据发送到此接口的实现类中
- Object ctx:自定义回调数据,在回调实现类可以获取此数据
示例代码:
import org.apache.zookeeper.*; import java.io.IOException; /**
* 创建节点(异步)
* Created by scot on 2016/6/8.
*/
public class CreateSessionASync implements Watcher{
private static ZooKeeper zooKeeper; @Override
public void process(WatchedEvent watchedEvent) { if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected)) {
doBus();
}
System.out.println("接收内容:"+watchedEvent.toString());
} private void doBus() {
zooKeeper.create("/note_scot/note_scot_b","aa".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL,new IStringCallBack(),"testAsync");
} public static void main(String[] args) {
try {
zooKeeper = new ZooKeeper("192.168.117.128:2181",5000, new CreateSessionASync());
System.out.println(zooKeeper.getState());
Thread.sleep(5000);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} static class IStringCallBack implements AsyncCallback.StringCallback { @Override
public void processResult(int i, String s, Object o, String s2) {
System.out.println("i="+i);//创建成功返回0
System.out.println("s="+s);//自定义节点名称
System.out.println("o="+o);//自定义回调数据
System.out.println("s2="+s2);//最终节点名称(顺序节点最终名称与自定义名称不同) }
}
}
常用方法列表:
| String create(final String path, byte data[], List acl, CreateMode createMode) |
参数: 路径、 znode内容,ACL(访问控制列表)、 znode创建类型; 用途:创建znode节点 |
| void delete(final String path, int version) |
参数: 路径、版本号;如果版本号与znode的版本号不一致,将无法删除,是一种乐观加锁机制;如果将版本号设置为-1,不会去检测版本,直接删除; 用途:删除节点 |
| Stat exists(final String path, Watcher watcher) |
参数: 路径、Watcher(监视器);当这个znode节点被改变时,将会触发当前Watcher 用途:判断znode节点是否存在 |
| Stat exists(String path, boolean watch) |
参数: 路径、并设置是否监控这个目录节点,这里的 watcher 是在创建 ZooKeeper 实例时指定的 watcher; 判断znode节点是否存在 |
| Stat setData(final String path, byte data[], int version) |
参数: 路径、数据、版本号;如果为-1,跳过版本检查 用途:设置znode上的数据 |
| byte[] getData(final String path, Watcher watcher, Stat stat) |
参数: 路径、监视器、数据版本等信息 用途:获取znode上的数据 |
| List getChildren(final String path, Watcher watcher) |
参数: 路径、监视器;该方法有多个重载 用途:获取节点下的所有子节点 |
下一节:2.2ZkClient使用
(原) 2.1 Zookeeper原生API使用的更多相关文章
- Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话
一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...
- zookeeper原生API做java客户端
简介 本文是使用apache提供的原生api做zookeeper客户端 jar包 zookeeper-3.4.5.jar Demo package bjsxt.zookeeper.base; im ...
- ZooKeeper 原生API操作
zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话 ...
- ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...
- ZooKeeper(七)-- ZK原生API实现分布式锁
一.使用场景 在分布式应用,往往存在多个进程提供同一服务.这些进程有可能在相同的机器上,也有可能分布在不同的机器上. 如果这些进程共享了一些资源,可能就需要分布式锁来锁定对这些资源的访问. 二.实现分 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API
打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...
- ZooKeeper实现配置中心的实例(原生API实现)(转)
说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...
- zookeeper zkClient api 使用
操作步骤: 一.引入zkclient的jar包(maven方式) <dependency> <groupId>com.101tec</groupId> <ar ...
随机推荐
- AngularJs之一
在讲正题之前,先说一下有关angular简介方面的信息: 1. angularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用 ...
- Atitit 教育与培训学校 的计划策划 v4 qc18
Atitit 教育与培训学校 的计划策划 v4 qc18 1.1. 版本历史12. 教育历史的前世今生12.1. 自学vs 家庭学校vs 私立学校vs 公立学校模式 vs 企业内部学校 vs 其他商业 ...
- 【初恋】vue单页应用开发总结
vue新人,没有高级技巧 本文主要总结了使用vue-cli脚手架安装开发环境,使用vue.js等进行单页应用开发所遇问题的总结. 技术栈: Vue v1.0.21, vue-resource v0.9 ...
- 基于redis实现可靠的分布式锁
什么是锁 今天要谈的是如何在分布式环境下实现一个全局锁,在开始之前先说说非分布式下的锁: 单机 – 单进程程序使用互斥锁mutex,解决多个线程之间的同步问题 单机 – 多进程程序使用信号量sem,解 ...
- 关于xcode导出设置中的一些概念
Development Certificates:在电脑通过秘钥串生成一个私人秘钥,这就是:CertificateSigningRequest.certSigningRequest 简称CSR,团队中 ...
- JavaScript之糟粕
0.导言 在上篇<JavaScript之毒瘤>中,列举了一些在JavaScript中难以避免的问题特性.本篇将会展示JavaScript中有问题的特性,但我们很容易就能便面它们.通过这些简 ...
- 6-tips-for-managing-property-files-with-spring--转
原文地址:http://www.summa.com/blog/2009/04/20/6-tips-for-managing-property-files-with-spring What could ...
- IOS-Foundation框架结构
这些东西,等用的时候查资料就行,用的多了,自然就记住了,大概过一下 发现一个不错的 ios 学习博客:http://www.cnblogs.com/kenshincui,非常好,推荐看看.FOunda ...
- 【TortoiseSVN使用教程】
TortoiseSVN使用教程 TortoiseSVN是一个SVN的客户端 1.Checkout Repository 首 先要Checkout服务器端的Repository,所谓的Ch ...
- Tomcat服务器本地的搭建,以及在 IDEA软件下的配置,以及项目的测试运行(基于supermvc框架下的web)
一.声明 使用了基于springmvc的supermvc的web框架.实习公司的框架. 二.tomact的下载与安装 1选择适合自己电脑配置的jdk和jre版本(截图来自tomcat的官方网站http ...