import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
/**
* Created by liuyuanyuan on 2019/8/4.
*/
public class HelloZk {
private static final String CONNECTSTRING = "192.168.19.129:2181";
private static final String PATH = "/LIUYUANYUAN";
private static final int SESSIONTIMEOUT = 20 * 1000;
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
HelloZk helloZk = new HelloZk();
ZooKeeper zk = helloZk.startZk();
if (zk.exists(PATH,false)==null){
helloZk.CreateZnode(zk,PATH,"YANGJIAOJIAO");
String data = helloZk.getNodes(zk,PATH);
System.out.println("data="+data);
}else{
System.out.println("节点已创建过了 ");
}
}
/**
* 创建zookeeper连接的方法
* @return
* @throws IOException
*/
public ZooKeeper startZk() throws IOException {
return new ZooKeeper(CONNECTSTRING, SESSIONTIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
/**
* 关闭zookeeper连接
* @param zk
* @throws InterruptedException
*/
public void StopZk(ZooKeeper zk) throws InterruptedException {
if (zk != null){
zk.close();
}
}
/**
* 创建一个节点
* @param zk
* @param path
* @param data
* @throws KeeperException
* @throws InterruptedException
*/
public void CreateZnode(ZooKeeper zk,String path ,String data) throws KeeperException, InterruptedException {
zk.create(path ,data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
/**
* 获取节点的值
* @param zk
* @param path
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public String getNodes (ZooKeeper zk,String path) throws KeeperException, InterruptedException {
String result = "";
byte [] bytes = zk.getData(path,false,new Stat());
result = new String (bytes);
return result;
}
}
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>zk</groupId>
<artifactId>zk</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
这里面涉及到zookeeper服务器的搭建,详见https://my.oschina.net/architectliuyuanyuan/blog/3082860
为数据设置一次watch
package com.zookeeper;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
public class WatchOne {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(HelloZk.class);
// 定义常量
private static final String CONNECTSTRING = "192.168.19.129:2181";
private static final String PATH = "/liuyuan";
private static final int SESSION_TIMEOUT = 50 * 1000;
// 定义实例变量
private ZooKeeper zk = null;
// 以下为业务方法
public ZooKeeper startZK() throws IOException {
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
}
public void stopZK() throws InterruptedException {
if (zk != null) {
zk.close();
}
}
public void createZNode(String path, String nodeValue) throws KeeperException, InterruptedException {
zk.create(path, nodeValue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
public String getZNode(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
try {
triggerValue(path);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
return new String(byteArray);
}
public String triggerValue(String path) throws KeeperException, InterruptedException {
byte[] byteArray = zk.getData(path, false, new Stat());
String retValue = new String(byteArray);
System.out.println("**************triggerValue: " + retValue);
return retValue;
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
WatchOne watchOne = new WatchOne();
watchOne.setZk(watchOne.startZK());
if (watchOne.getZk().exists(PATH, false) == null) {
watchOne.createZNode(PATH, "BBB");
System.out.println("**********************>: " + watchOne.getZNode(PATH));
Thread.sleep(Long.MAX_VALUE);
} else {
System.out.println("i have znode");
}
}
// setter---getter
public ZooKeeper getZk() {
return zk;
}
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
}
多次watch
package com.zookeeper;
import java.io.IOException;
import org.apache.log4j.Logger;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
public class WatchMoreTest
{
/**
*
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(WatchMoreTest.class);
//定义常量
private static final String CONNECTSTRING = "192.168.19.129:2181";
private static final String PATH = "/liuyuan";
private static final int SESSION_TIMEOUT = 50*1000;
//定义实例变量
private ZooKeeper zk = null;
private String lastValue = "";
//以下为业务方法
public ZooKeeper startZK() throws IOException
{
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event)
{}
});
}
public void stopZK() throws InterruptedException
{
if(zk != null)
{
zk.close();
}
}
public void createZNode(String path,String nodeValue) throws KeeperException, InterruptedException
{
zk.create(path,nodeValue.getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
public String getZNode(String path) throws KeeperException, InterruptedException
{
byte[] byteArray = zk.getData(path,new Watcher() {
@Override
public void process(WatchedEvent event)
{
try
{
triggerValue(path);
}catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
return new String(byteArray);
}
public boolean triggerValue(String path) throws KeeperException, InterruptedException
{
byte[] byteArray = zk.getData(path,new Watcher() {
@Override
public void process(WatchedEvent event)
{
try
{
triggerValue(path);
}catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
String newValue = new String(byteArray);
if(lastValue.equals(newValue))
{
System.out.println("there is no change~~~~~~~~");
return false;
}else{
System.out.println("lastValue: "+lastValue+"\t"+"newValue: "+newValue);
this.lastValue = newValue;
return true;
}
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException
{
WatchMoreTest watch = new WatchMoreTest();
watch.setZk(watch.startZK());
if(watch.getZk().exists(PATH, false) == null)
{
String initValue = "0000";
watch.setLastValue(initValue);
watch.createZNode(PATH,initValue);
System.out.println("**********************>: "+watch.getZNode(PATH));
Thread.sleep(Long.MAX_VALUE);
}else{
System.out.println("i have znode");
}
}
//setter---getter
public ZooKeeper getZk()
{
return zk;
}
public void setZk(ZooKeeper zk)
{
this.zk = zk;
}
public String getLastValue()
{
return lastValue;
}
public void setLastValue(String lastValue)
{
this.lastValue = lastValue;
}
}
一个watch只能监听一次,多个watch,就是创建多个watch对象