zookeeper实现服务器端监控代码实现

来源:互联网 发布:电流转换器淘宝 编辑:程序博客网 时间:2024/05/21 03:55

服务器端代码如下:

package com.lhc.clientmanager;



import java.util.concurrent.CountDownLatch;


import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;


/**
 * 模拟服务器端,监听znode节点
 * @author administrator
 *
 */
public class ClientAuto {

// zk对象
static ZooKeeper zk;
// 用来阻止程序运行,参数表示在它释放所有等待线程之前需要发生的事件数
// 即执行countDown()方法后计数器减1,则await()方法返回
private static CountDownLatch countDown = new CountDownLatch(1);
// 创建连接相关信息
// 连接地址
static String connect = "master:2181,slave1:2181,slave2:2181";
// 连接超时时间
static int TIME_OUT = 2000;
// 连接监听器
Watcher connectWatcher = new Watcher() {
// 当客户端与Zookeeper服务建立连接后,该方法会被调用,参数是一个表示该连接的事件
public void process(WatchedEvent event) {
System.out.println("接收到zookeeper服务端通知,会话真正创建完成!");
}

};
// 节点是否存在监听器
Watcher existsWatcher = new Watcher() {

public void process(WatchedEvent event) {
// 子节点名称
String nodeName = event.getPath().split("/")[2];
try {
if (event.getType().toString().equals("NodeCreated")) {
System.out.println("节点" + nodeName + "上线!");
} else if (event.getType().toString().equals("NodeDeleted")) {
System.out.println("节点" + nodeName + "下线!");
} else if (event.getType().toString().equals("NodeDataChanged")) {
System.out.println("节点" + nodeName + "中的数据已经被修改");
} else if (event.getType().toString().equals("NodeChildrenChanged")) {
System.out.println("节点" + nodeName + "的子节点被修改");
} else {
System.out.println("event的信息:"+event);
}
// 重复注册watcher,否则监听器失效
// 因观察只能被触发一次,所以必须多次重复注册
// 如果有多个集群节点,可注册多集群节点
zk.exists("/nodeManager/tempNode1", existsWatcher);
zk.exists("/nodeManager/tempNode2", existsWatcher);
zk.exists("/nodeManager/tempNode3", existsWatcher);
} catch (Exception e) {
e.printStackTrace();
}
}
};

/**
* 初始化zk对象
* @throws Exception
*/
public void init() throws Exception {
zk = new ZooKeeper(connect, TIME_OUT, connectWatcher);
}

/**
* 向zk服务器注册集群节点,同时会给出上线通知
* @param zk
* @throws Exception
*/
public void checkExists(ZooKeeper zk) throws Exception {
zk.exists("/nodeManager/tempNode1", existsWatcher);
zk.exists("/nodeManager/tempNode2", existsWatcher);
zk.exists("/nodeManager/tempNode3", existsWatcher);
}

public static void main(String[] args) throws Exception {
ClientAuto auto = new ClientAuto();
auto.init();
auto.checkExists(zk);
countDown.await();
}

}


客户端代码如下:

package com.lhc.client;


import java.util.concurrent.CountDownLatch;


import org.apache.zookeeper.CreateMode;
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;


/**
 * znode1节点
 * @author administrator
 *
 */
public class Client1 {
// 用来阻止程序运行
private static CountDownLatch countDown = new CountDownLatch(1);
/* 创建连接相关信息 */
// 连接地址
static String connect = "master:2181,slave1:2181,slave2:2181";
// 连接超时时间
static int TIME_OUT = 2000;
// zk对象
static ZooKeeper zk;
static Watcher watcher = new Watcher() {

public void process(WatchedEvent event) {
System.out.println("接收到zookeeper服务端通知");
System.out.println("此时zk对象信息:" + zk);
try {
// 判断指定父节点是否存在
Stat s = zk.exists("/nodeManager", true);
if (null == s) {
System.out.println("管理客户端节点不存在,先创建一个……");
// 模拟创建节点1
// Ids.OPEN_ACL_UNSAFE即将所有权限授予每个人
// CreateMode.EPHEMERAL节点类型为短暂,即客户端会话结束,节点消失
zk.create("/nodeManager", "nodeManager".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
System.out.println("node1开始向服务器端注册");
String path = zk.create("/nodeManager/tempNode1", "node1".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("node1向服务器端注册成功!");
} catch (Exception e) {
System.out.println("会话创建完成后创建临时节点时出现异常:" + e.getMessage());
}
}
};

public static void main(String[] args) throws Exception {
System.out.println("客户端1程序开始启动……");
zk = new ZooKeeper(connect, TIME_OUT, watcher);
System.out.println("zk对象创建完成!正在异步创建和zk服务器之间的连接:");
System.out.println("zk对象的信息:" + zk);
countDown.await();
}
}


模仿服务器端监听客户端连接状态,当客户端向管理节点注册时,触发监听,服务器收到监听信息,并告知该客户端已上线

0 0
原创粉丝点击