您的位置:首页 > 编程语言

zooKeeper常用的api编程-简单

2018-03-20 19:51 465 查看
注意:zookeeper客户端和服务器会话的建立是一个异步的过程,也就是说在程序中,程序方法在处理完客户端初始化后立即返回(即程序继续往下执行代码,这样,在大多数情况下并没有真正的构建好一个可用会话,在会话的生命周期处于“CONNECTING”时才算真正的建立完毕,所以需要使用到多线程中的一个工具类CountDownLatch)。

Idea+maven<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent>
<artifactId>zookeeper</artifactId>
<groupId>com.demo</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>ZKDemo</artifactId>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

<properties>
<zk.version>3.4.8</zk.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zk.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
</project>
代码:(自己写的一个demo)package com.demo;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
* @Author: cxx
* @Date: 2018/3/20 15:58
*/
public class SimpleZkClient {
private static final String connect = "ip:2181";
ZooKeeper zkClient=null;
private static final int sessionTimeout = 2000;
/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */
static final CountDownLatch connectedSemaphore = new CountDownLatch(1);
@Before
public void init() throws IOException {
//创建zookeeper是异步过程,由其他线程负责
zkClient = new ZooKeeper(connect, sessionTimeout, new Watcher() {
public void process(WatchedEvent event) {
// 收到事件通知后的回调函数(应该是我们自己的事件处理逻辑)
//获取事件的状态
Event.KeeperState keeperState = event.getState();
Event.EventType eventType = event.getType();
if(Event.KeeperState.SyncConnected == keeperState){
//如果建立连接成功,则发送信号量,让后续阻塞程序向下执行
connectedSemaphore.countDown();
System.out.println("zk 建立连接");
}
}
});
}

// 获取子节点
@Test
public void getChildren() throws Exception {
List<String> children = zkClient.getChildren("/", true);
for (String child : children) {
System.out.println(child);
}
Thread.sleep(Long.MAX_VALUE);
}

//创建路径
@Test
public void createChildren() throws KeeperException, InterruptedException {
// 参数1:要创建的节点的路径 参数2:节点的数据 参数3:节点的权限 参数4:节点的类型
String nodeCreate = zkClient.create("/cxx","hah".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
// 上传的数据可以是任何类型,但都要转成byte[]
}

//判断路径是否存在
@Test
public void testExists() throws KeeperException, InterruptedException {
Stat stat = zkClient.exists("/test",false);
System.out.println(stat==null?"not exist":"exist");
}

//获取节点数据
@Test
public void getData() throws KeeperException, InterruptedException {
byte[] data = zkClient.getData("/test",false,null);
System.out.println(new String(data));
}

//删除节点
@Test
public void deleteZnode() throws KeeperException, InterruptedException {
String path ="/java6";
for(String str : zkClient.getChildren(path,false)){
System.out.println(str);
String newPath=path+"/"+str;
zkClient.delete(newPath,-1);
}
zkClient.delete(path,-1);
}

// 更新节点数据
@Test
public void setData() throws KeeperException, InterruptedException {
zkClient.setData("/java6", "I Miss you".getBytes(), -1);
byte[] data = zkClient.getData("/java6", false, null);
System.out.println(new String(data));
}
}

原生的zookeeper API提供了两种创建节点的方法,同步和异步创建节点方式。

同步方式:

参数1,节点路径(名称):/nodeName。不允许递归创建节点,在父节点不存在的情况下,不允许创建子节点。参数2,节点内容:要求类型是字节数组,也就是说不支持序列话方式,如果需要实现序列化,可使用java相关序列化框架,如Hessian,Kryo。参数3,节点权限:使用Ids.OPEN_ACL_UNSAFE开放权限即可。参数4,节点类型:创建节点的类型,CreateMode.*,提供了如下所示的四种节点类型:①PERSISTENT(持久节点)
②PERSISTENT_SEQUENTIAL(持久顺序节点)
③EPHEMERAL(临时节点,本次会话有效)
④EPHEMERAL_SEQUENTIAL(临时顺序节点,本次会话有效)异步方式(在同步方法参数的基础上增加两个参数):参数5,回调方法:注册一个异步回调方法,要实现AsynCallBack.StringCallBack接口,重写processResult(int rc, String path, Object ctx, String name)方法,当节点创建完成后执行此方法。①rc:服务端响应码,0表示调用成功、-4表示端口连接、-110表示指定节点存在、-112表示会话已过期。
②path:接口调用时传入的数据节点的路径参数。
③ctx:调用接口传入的ctx值。
④name:实际在服务端创建的节点的名称。参数6,传递给回调方法的参数,一般为上下文(Context)信息。

package com.demo;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import or
4000
g.apache.zookeeper.data.Stat;

public class Master implements Watcher{
public final int SESSION_TIMEOUT=5000;
private String host;
private ZooKeeper zooKeeper;
/** 信号量设置,用于等待zookeeper连接建立之后 通知阻塞程序继续向下执行 */
private CountDownLatch connectedSemaphore = new CountDownLatch(1);

public Master(String host){
this.host=host;
}

// 连接ZK服务器的方法,由于在创建ZK对象的时候就需要获取连接
// 创建ZK对象是异步的过程。
public void connect() throws IOException, KeeperException, InterruptedException {
System.out.println("connect方法的线程:"+Thread.currentThread().getName());
zooKeeper=new ZooKeeper(host,SESSION_TIMEOUT,this);
connectedSemaphore.await();
}

@Override
public void process(WatchedEvent event){
// 连接状态
Event.KeeperState keeperState = event.getState();
// 事件类型
Event.EventType eventType = event.getType();
// 受影响的path
String path = event.getPath();
System.out.println("收到Watcher通知");
System.out.println("连接状态:\t" + keeperState.toString());
System.out.println("事件类型:\t" + eventType.toString());
System.out.println("process方法的线程:"+Thread.currentThread().getName());
if (Event.KeeperState.SyncConnected == keeperState) {
// 成功连接上ZK服务器
System.out.println("eventType:"+eventType);
if (Event.EventType.None == eventType) {
System.out.println("成功连接上ZK服务器");
connectedSemaphore.countDown();
}
}
}

public void close() throws InterruptedException{
zooKeeper.close();
}

public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
Master master=new Master("115.159.126.205:2181");
System.out.println("main方法的线程:"+Thread.currentThread().getName());
master.connect();
Thread.sleep(Long.MAX_VALUE);
master.close();
}
}
"C:\Program Files (x86)\Java\jdk1.8.0_151\bin\java" "-javaagent:D:\IntelliJ IDEA 2017.2.5\lib\idea_rt.jar=53525:D:\IntelliJ IDEA 2017.2.5\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\cxx\Desktop\zookeeper\ZKDemo\target\classes;C:\Users\cxx\.m2\repository\org\apache\zookeeper\zookeeper\3.4.8\zookeeper-3.4.8.jar;C:\Users\cxx\.m2\repository\org\slf4j\slf4j-api\1.6.1\slf4j-api-1.6.1.jar;C:\Users\cxx\.m2\repository\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;C:\Users\cxx\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\cxx\.m2\repository\jline\jline\0.9.94\jline-0.9.94.jar;C:\Users\cxx\.m2\repository\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;C:\Users\cxx\.m2\repository\com\jeesite\beetl\2.7-SNAPSHOT\beetl-2.7-SNAPSHOT.jar;C:\Users\cxx\.m2\repository\org\antlr\antlr4-runtime\4.6\antlr4-runtime-4.6.jar;C:\Users\cxx\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\cxx\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar" com.demo.Master
main方法的线程:main
connect方法的线程:main
2018-03-20 20:06:30,370 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT
2018-03-20 20:06:30,372 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:host.name=cxx
2018-03-20 20:06:30,372 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.version=1.8.0_151
2018-03-20 20:06:30,372 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.vendor=Oracle Corporation
2018-03-20 20:06:30,372 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.home=C:\Program Files (x86)\Java\jdk1.8.0_151\jre
2018-03-20 20:06:30,372 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.class.path=C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\lib\rt.jar;C:\Users\cxx\Desktop\zookeeper\ZKDemo\target\classes;C:\Users\cxx\.m2\repository\org\apache\zookeeper\zookeeper\3.4.8\zookeeper-3.4.8.jar;C:\Users\cxx\.m2\repository\org\slf4j\slf4j-api\1.6.1\slf4j-api-1.6.1.jar;C:\Users\cxx\.m2\repository\org\slf4j\slf4j-log4j12\1.6.1\slf4j-log4j12-1.6.1.jar;C:\Users\cxx\.m2\repository\log4j\log4j\1.2.16\log4j-1.2.16.jar;C:\Users\cxx\.m2\repository\jline\jline\0.9.94\jline-0.9.94.jar;C:\Users\cxx\.m2\repository\io\netty\netty\3.7.0.Final\netty-3.7.0.Final.jar;C:\Users\cxx\.m2\repository\com\jeesite\beetl\2.7-SNAPSHOT\beetl-2.7-SNAPSHOT.jar;C:\Users\cxx\.m2\repository\org\antlr\antlr4-runtime\4.6\antlr4-runtime-4.6.jar;C:\Users\cxx\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\cxx\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\IntelliJ IDEA 2017.2.5\lib\idea_rt.jar
2018-03-20 20:06:30,373 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.library.path=C:\Program Files (x86)\Java\jdk1.8.0_151\bin;C:\WINDOWS\Sun\Java\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\Python\Scripts\;C:\Python\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files (x86)\Java\jdk1.8.0_151\bin;C:\Program Files (x86)\Java\jdk1.8.0_151\jre\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;D:\apache-maven-3.3.9\bin;D:\apache-jena-3.6.0\bat;C:\Program Files\Intel\WiFi\bin\;C:\Program Files\Common Files\Intel\WirelessCommon\;C:\Users\cxx\AppData\Local\Microsoft\WindowsApps;.
2018-03-20 20:06:30,373 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.io.tmpdir=C:\Users\cxx\AppData\Local\Temp\
2018-03-20 20:06:30,373 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:java.compiler=<NA>
2018-03-20 20:06:30,373 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.name=Windows 10
2018-03-20 20:06:30,375 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.arch=amd64
2018-03-20 20:06:30,376 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:os.version=10.0
2018-03-20 20:06:30,376 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.name=cxx
2018-03-20 20:06:30,376 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.home=C:\Users\cxx
2018-03-20 20:06:30,376 INFO [org.apache.zookeeper.ZooKeeper] - Client environment:user.dir=C:\Users\cxx\Desktop\zookeeper
2018-03-20 20:06:30,379 INFO [org.apache.zookeeper.ZooKeeper] - Initiating client connection, connectString=115.159.126.205:2181 sessionTimeout=5000 watcher=com.demo.Master@5a10411
2018-03-20 20:06:30,775 INFO [org.apache.zookeeper.ClientCnxn] - Opening socket connection to server 115.159.126.205/115.159.126.205:2181. Will not attempt to authenticate using SASL (unknown error)
2018-03-20 20:06:30,799 INFO [org.apache.zookeeper.ClientCnxn] - Socket connection established to 115.159.126.205/115.159.126.205:2181, initiating session
2018-03-20 20:06:30,837 INFO [org.apache.zookeeper.ClientCnxn] - Session establishment complete on server 115.159.126.205/115.159.126.205:2181, sessionid = 0x6242217c640021, negotiated timeout = 5000
收到Watcher通知
连接状态:	SyncConnected
事件类型:	None
process方法的线程:main-EventThread
eventType:None
成功连接上ZK服务器
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  zookeeper编程