1 通过下面方法充分理解zookeeper的结构
zookpeer = 树形结构+通知机制
有点像:wait 和 notifyall
操作步骤:建立多个这样的客户端,通过命令更改zookeeper服务
set /atcunzi/distribute AAA ; set /atcunzi/distribute BBB 查看运行结果
注意 triggerValue方法和递归方法的区别
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.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class ClientA
{
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(ClientA.class);
// 定义常量
private static final String CONNECTSTRING = "192.168.31.167:2181";
private static final int SESSION_TIMEOUT = 50 * 1000;
private static final String PATH = "/atcunzi/distributed";
// 定义实例变量
private ZooKeeper zk = null;
public ZooKeeper startZK() throws IOException
{
return new ZooKeeper(CONNECTSTRING, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event)
{
}
});
}
public String getZNode(String nodePath) throws KeeperException, InterruptedException
{
String result = "";
byte[] byteArray = zk.getData(nodePath, new Watcher() {
@Override
public void process(WatchedEvent event)
{
try
{
triggerValue(nodePath);
}catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
result = new String(byteArray);
return result; //abc
}
public boolean triggerValue(String nodePath) throws KeeperException, InterruptedException
{
String result = "";
byte[] byteArray = zk.getData(nodePath, new Watcher() {
@Override
public void process(WatchedEvent event)
{
try {
triggerValue(nodePath);
}
catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, new Stat());
result = new String(byteArray);
if("AAA".equalsIgnoreCase(result))
{
logger.info("**********change AAA runn......");
return true;
}else{
return false;
}
}
public static void main(String[] args) throws IOException, KeeperException, InterruptedException
{
ClientA a = new ClientA();
a.setZk(a.startZK());
logger.info("****************first result: "+a.getZNode(PATH));
Thread.sleep(Long.MAX_VALUE);
}
// setter------getter
public ZooKeeper getZk()
{
return zk;
}
public void setZk(ZooKeeper zk)
{
this.zk = zk;
}
}
5 maven配置
<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>com.atguigu.zk1014</groupId>
<artifactId>zk1014</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>zk1014</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<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>