Zookeeper(三)-- JAVA原生API
一、前提
jar包:zookeeper-3.4.9.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.15.jar
二、Demo
package com.xbq.zookeeper; import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider; /**
* @ClassName: ZookeeperDemo
* @Description: TODO zookeeper测试
* @author xbq
* @version 1.0
* @date 2017-3-10 下午5:05:16
*/
public class ZookeeperDemo { private static final int SESSION_TIMEOUT = 3000; public static void main(String[] args) {
Zookeeper zooKeeper = null;
try {
zooKeeper = new ZooKeeper("192.168.242.128:2183", SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("触发事件:" + event.getType());
}
});
String path = "/node_xbq";
String data = "TestxbqCoder"; create(zooKeeper, path, data); // update(zooKeeper, path, data); // delete(zooKeeper, path); // aclOper(zooKeeper, path, data); // aclOper2(zooKeeper, path, data); // doWatch(zooKeeper, path, data); } catch (Exception e) {
e.printStackTrace();
} finally {
if(zooKeeper ! = null){
try{
zooKeeper.close();
}catch(Exception e){
}
}
}
} /**
* @Title: create
* @Description: TODO 增加操作
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void create(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) == null){ // 如果不存在节点,就新建
// 第三个参数是 权限,第四个参数 代表持久节点
// 权限分类:OPEN_ACL_UNSAFE:对所有用户开放 READ_ACL_UNSAFE:只读 CREATOR_ALL_ACL: 创建者可以做任何操作
zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
System.out.println(new String(zooKeeper.getData(path, true, null)));
} /**
* @Title: update
* @Description: TODO 修改操作
* @param zooKeeper
* @return: void
* @throws InterruptedException
* @throws KeeperException
*/
public static void update(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException {
zooKeeper.setData(path, data.getBytes(), -1); // -1标识任何版本号 都可以
System.out.println(new String(zooKeeper.getData(path, true, null)));
} /**
* @Title: delete
* @Description: TODO 删除
* @param zooKeeper
* @param path
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void delete(ZooKeeper zooKeeper, String path) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) != null){
zooKeeper.delete(path, -1);
}
if(zooKeeper.exists(path, false) != null){
System.out.println(new String(zooKeeper.getData(path, true, null)));
}
} /**
* @Title: aclOper
* @Description: TODO 权限测试 先创建一个只读权限节点,然后更新该节点
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void aclOper(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
// 首先创建一个只读的节点。第三个参数 代表只读权限
zooKeeper.create(path, data.getBytes(), Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(new String(zooKeeper.getData(path, true, null)));
// 测试更新节点,因为增加的是 只读的,所以 应该是不可以修改的。发现报错:org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /node_xbq
zooKeeper.setData(path, "testRead_ACL".getBytes(), -1);
} /**
* @Title: aclOper2
* @Description: TODO 自定义权限验证
* 自定义schema权限类型:digest,world,auth,ip,这里用 digest举例
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @throws NoSuchAlgorithmException
* @return: void
*/
public static void aclOper2(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException, NoSuchAlgorithmException{
// 第一个参数是 所有的权限,第二个参数是 通过 用户名和密码 验证
ACL acl = new ACL(ZooDefs.Perms.ALL, new Id("digest", DigestAuthenticationProvider.generateDigest("root:root")));
List<ACL> acls = new ArrayList<ACL>();
acls.add(acl); if(zooKeeper.exists(path, false) == null){
zooKeeper.create(path, data.getBytes(), acls, CreateMode.PERSISTENT);
} zooKeeper.addAuthInfo("digest", "root:root".getBytes()); // 通过下面的方式 是可以取到值的,因为 加了 用户名和 密码 验证 ,需要 加上 zooKeeper.addAuthInfo("digest", "root:root".getBytes());
System.out.println(new String(zooKeeper.getData(path, true, null)));
} /**
* @Title: doWatch
* @Description: TODO 监听
* @param zooKeeper
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
* @return: void
*/
public static void doWatch(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
if(zooKeeper.exists(path, false) == null){
zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
// 监听 path节点
zooKeeper.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("触发了节点变更事件:" + event.getType());
}
}, null);
// 用更新操作触发 监听事件
zooKeeper.setData(path, "updateTest".getBytes(), -1);
}
}
三、源码下载
http://git.oschina.net/xbq168/Zookeeper-Demo
Zookeeper(三)-- JAVA原生API的更多相关文章
- Zookeeper的java客户端API使用方法(五)
前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...
- curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API
打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...
- zookeeper的Java端API应用
1. 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话.它提供了表1所示几类主要方法: 功能 描述 create 在本地目录树中创建 ...
- Zookeeper系列2 原生API 以及核心特性watcher
原生API 增删改查询 public class ZkBaseTest { static final String CONNECT_ADDR = "192.168.0.120"; ...
- zookeeper的Java客户端API
zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...
- 【代码笔记】Java常识性基础补充(三)——Java的API及Object类、正则表达式、getTime()方法、DateFormat类、Calendar类
1.0 Java 的API(API: Application(应用) Programming(程序) Interface(接口)) 2.0 Java API就是JDK中提供给我们使用的类,这些类将底层 ...
- Java原生API操作XML
使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...
- [转载] ZooKeeper的Java客户端API
转载自 http://www.cnblogs.com/ggjucheng/p/3370359.html http://zookeeper.apache.org/doc/trunk/javaExampl ...
- 六:ZooKeeper的java客户端api的使用
一:客户端链接测试 package com.yeepay.sxf.createConnection; import java.io.IOException; import org.apache.zoo ...
随机推荐
- python基础系列教程——Python中的编码问题,中文乱码问题
python基础系列教程——Python中的编码问题,中文乱码问题 如果不声明编码,则中文会报错,即使是注释也会报错. # -*- coding: UTF-8 -*- 或者 #coding=utf-8 ...
- C语言 · 贪心算法
发现蓝桥杯上好多题目涉及到贪心,决定学一学. 贪心算法是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说:不从整体最优上考虑,而是在某种意义上的局部最优解.其关键是贪心策略的选择,选择的贪心 ...
- C语言 · 新建Microsoft Word文档
算法提高 新建Microsoft Word文档 时间限制:1.0s 内存限制:256.0MB 问题描述 L正在出题,新建了一个word文档,想不好取什么名字,身旁一人惊问:“你出的题 ...
- cglib 动态代理基础篇
cglib 动态代理基础篇 CGlib是什么? CGlib是一个强大的,高性能,高质量的Code生成类库.它可以在运行期扩展Java类与实现Java接口. 下面我们将通过一个具体的事例来看一下CGli ...
- Qt 事件过滤器
Qt创建了QEvent事件对象之后,会调用QObject的event()函数做事件的分发.有时候,你可能需要在调用event()函数之前做一些另外的操作,比如,对话框上某些组件可能并不需要响应回车按下 ...
- java中main函数解析
从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...
- BCM_I2C函数更改
版本:sdk-xgs-robo- 平台:BCM53344 应用:控制POE芯片 描述:POE控制芯片使用PD69200,使用i2c与其通信,每次需要发送15字节数据,并接受15字节的返回数据. 1.更 ...
- Spring 4 官方文档学习(六)核心技术之Spring AOP
目录 1.介绍 1.1.AOP概念 1.2.Spring AOP 能力 和 目标 1.2.1.简介 1.2.2.@AspectJ 支持 1.2.3.声明一个aspect 例子 1.2.4.声明advi ...
- Eclipse 调试总进入Spring代理的解决办法
一直都是跳入代理类中,手动切换查看内容,还以为别人也是这样,结果被告知不是.瞬间囧囧. 搜了一番,看起来有两个办法. 第一个:使用step filter,过滤掉不需要的package.--未测试 第二 ...
- 【转载】C#进阶系列——动态Lamada(二:优化)
前言:前几天写了一篇动态Lamada的文章C#进阶系列——动态Lamada,受园友xiao99的启发,今天打算来重新优化下这个动态Lamada的工具类.在此做个笔记,以免以后忘了. 一.原理分析 上篇 ...