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 ...
随机推荐
- php写杨辉三角算法
<?phpfunction YangHui($iLine) { for ($i = 0;$i <= $iLine;$i++)//行 { for ($j ...
- java质量提升相关
http://blog.sina.com.cn/s/blog_6814a1510102v2rp.html
- wpf/Silverlight/wp中如何绑定模板中的属性
<Style TargetType="{x:Type TabItem}" x:Key="EditorTabItemStyle"> <Sette ...
- SQL server 2005如何设置一个或几个字段唯一约束?
--建立是在三个字段上的唯一约束 alter table Tab add constraint uq_id unique(shipType, shipsession, Territory)
- echart 地图
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- guava处理字符串与List之间,字符串与map之间的转换<转>
import static org.junit.Assert.*; import java.util.List; import java.util.Map; import org.junit.Test ...
- tomcat7项目启动报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory
报这个错说明用的是tomcat7 打开myeclipse,Preferentces->MyEclipse->Servers->Tomcat->Tomcat 6.x ,载入 ...
- catalina.home和catalina.base这两个属性的作用
catalina.home和catalina.base这两个属性仅在你需要安装多个Tomcat实例而不想安装多个软件备份的时候使用,这样能节省磁盘空间.以Tomcat6.0为例,其Tomcat目录结构 ...
- 关闭 禁用 Redis危险命令
Redis的危险命令主要有: flushdb,清空数据库 flushall,清空所有记录,数据库 config,客户端连接后可配置服务器 keys,客户端连接后可查看所有存在的键 我们常常需要禁用以上 ...
- DataGridView基本操作
1.获得某个(指定的)单元格的值:dataGridView1.Row[i].Cells[j].Value;2.获得选中的总行数:dataGridView1.SelectedRows.Count;3.获 ...