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

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

2015-12-16 23:35 363 查看
服务器端代码如下:

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();

}

}

模仿服务器端监听客户端连接状态,当客户端向管理节点注册时,触发监听,服务器收到监听信息,并告知该客户端已上线
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: