Cluster demo

package bjsxt.zookeeper.cluster;

import bjsxt.zookeeper.cluster.ZKWatcher;

public class Client1 {

public static void main(String[] args) throws Exception{

ZKWatcher myWatcher = new ZKWatcher();

Thread.sleep(100000000);

}

}

package bjsxt.zookeeper.cluster;

import bjsxt.zookeeper.cluster.ZKWatcher;

public class Client2 {

public static void main(String[] args) throws Exception{

ZKWatcher myWatcher = new ZKWatcher();

Thread.sleep(100000000);

}

}

package bjsxt.zookeeper.cluster;

import java.util.List;

import java.util.Map;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.CopyOnWriteArrayList;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.KeeperException;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.Watcher.Event.EventType;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

public class ZKWatcher implements Watcher {

/** zk变量 */

private ZooKeeper zk = null;

/** 父节点path */

static final String PARENT_PATH = "/super";

/** 信号量设置,用于等待zookeeper连接建立之后 通知阻塞程序继续向下执行 */

private CountDownLatch connectedSemaphore = new CountDownLatch(1);

private List<String> cowaList = new CopyOnWriteArrayList<String>();

/** zookeeper服务器地址 */

public static final String CONNECTION_ADDR = "192.168.80.88:2181,192.168.80.87:2181,192.168.80.86:2181";

/** 定义session失效时间 */

public static final int SESSION_TIMEOUT = 30000;

public ZKWatcher() throws Exception{

zk = new ZooKeeper(CONNECTION_ADDR, SESSION_TIMEOUT, this);

System.out.println("开始连接ZK服务器");

connectedSemaphore.await();

}

@Override

public void process(WatchedEvent event) {

// 连接状态

KeeperState keeperState = event.getState();

// 事件类型

EventType eventType = event.getType();

// 受影响的path

String path = event.getPath();

System.out.println("受影响的path : " + path);

if (KeeperState.SyncConnected == keeperState) {

// 成功连接上ZK服务器

if (EventType.None == eventType) {

System.out.println("成功连接上ZK服务器");

connectedSemaphore.countDown();

try {

if(this.zk.exists(PARENT_PATH, false) == null){

this.zk.create(PARENT_PATH, "root".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  

}

List<String> paths = this.zk.getChildren(PARENT_PATH, true);

for (String p : paths) {

System.out.println(p);

this.zk.exists(PARENT_PATH + "/" + p, true);

}

} catch (KeeperException | InterruptedException e) {

e.printStackTrace();

}

}

//创建节点

else if (EventType.NodeCreated == eventType) {

System.out.println("节点创建");

try {

this.zk.exists(path, true);

} catch (KeeperException | InterruptedException e) {

e.printStackTrace();

}

}

//更新节点

else if (EventType.NodeDataChanged == eventType) {

System.out.println("节点数据更新");

try {

//update nodes  call function

this.zk.exists(path, true);

} catch (KeeperException | InterruptedException e) {

e.printStackTrace();

}

}

//更新子节点

else if (EventType.NodeChildrenChanged == eventType) {

System.out.println("子节点 ... 变更");

try {

List<String> paths = this.zk.getChildren(path, true);

if(paths.size() >= cowaList.size()){

paths.removeAll(cowaList);

for(String p : paths){

this.zk.exists(path + "/" + p, true);

//this.zk.getChildren(path + "/" + p, true);

System.out.println("这个是新增的子节点 : " + path + "/" + p);

//add new nodes  call function

}

cowaList.addAll(paths);

} else {

cowaList = paths;

}

System.out.println("cowaList: " + cowaList.toString());

System.out.println("paths: " + paths.toString());

} catch (KeeperException | InterruptedException e) {

e.printStackTrace();

}

}

//删除节点

else if (EventType.NodeDeleted == eventType) {

System.out.println("节点 " + path + " 被删除");

try {

//delete nodes  call function

this.zk.exists(path, true);

} catch (KeeperException | InterruptedException e) {

e.printStackTrace();

}

}

else ;

}

else if (KeeperState.Disconnected == keeperState) {

System.out.println("与ZK服务器断开连接");

}

else if (KeeperState.AuthFailed == keeperState) {

System.out.println("权限检查失败");

}

else if (KeeperState.Expired == keeperState) {

System.out.println("会话失效");

}

else ;

System.out.println("--------------------------------------------");

}

}

package bjsxt.zookeeper.cluster;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.WatchedEvent;

import org.apache.zookeeper.Watcher;

import org.apache.zookeeper.Watcher.Event.EventType;

import org.apache.zookeeper.Watcher.Event.KeeperState;

import org.apache.zookeeper.ZooDefs.Ids;

import org.apache.zookeeper.ZooKeeper;

public class Test {

/** zookeeper地址 */

static final String CONNECT_ADDR = "192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181";

/** session超时时间 */

static final int SESSION_OUTTIME = 2000;//ms

/** 信号量,阻塞程序执行,用于等待zookeeper连接成功,发送成功信号 */

static final CountDownLatch connectedSemaphore = new CountDownLatch(1);

public static void main(String[] args) throws Exception{

ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher(){

@Override

public void process(WatchedEvent event) {

//获取事件的状态

KeeperState keeperState = event.getState();

EventType eventType = event.getType();

//如果是建立连接

if(KeeperState.SyncConnected == keeperState){

if(EventType.None == eventType){

//如果建立连接成功,则发送信号量,让后续阻塞程序向下执行

connectedSemaphore.countDown();

System.out.println("zk 建立连接");

}

}

}

});

//进行阻塞

connectedSemaphore.await();

// //创建子节点

// zk.create("/super/c1", "c1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//创建子节点

// zk.create("/super/c2", "c2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//创建子节点

zk.create("/super/c3", "c3".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//创建子节点

// zk.create("/super/c4", "c4".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// zk.create("/super/c4/c44", "c44".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

//获取节点信息

// byte[] data = zk.getData("/testRoot", false, null);

// System.out.println(new String(data));

// System.out.println(zk.getChildren("/testRoot", false));

//修改节点的值

// zk.setData("/super/c1", "modify c1".getBytes(), -1);

// zk.setData("/super/c2", "modify c2".getBytes(), -1);

// byte[] data = zk.getData("/super/c2", false, null);

// System.out.println(new String(data));

// //判断节点是否存在

// System.out.println(zk.exists("/super/c3", false));

// //删除节点

// zk.delete("/super/c3", -1);

zk.close();

}

}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值