消费者
package com.wyz.zk;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class Client {
//zk集群地址
private static String connentStr ="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
//session 超时(毫秒)
private static int sessionTimeout =4000;
//父node 节点
private String parentNode ="/servers";
//zk对象
private ZooKeeper clientZk = null;
public static void main(String[] args) throws Exception {
Client client = new Client();
//todo 1.获取zk连接
client.getConnect();
//todo 2.获取zk下servers的子节点信息,从中获取服务器信息列表
client.getServerList();
//todo 3.业务进程启动
client.business();
}
//todo 1.获取zk连接
private void getConnect() throws IOException {
clientZk = new ZooKeeper(connentStr, sessionTimeout, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//todo 监听事件处理
try {
//再次启动
getServerList();
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
//todo 2.获取zk下servers的子节点信息,从中获取服务器信息列表
private void getServerList() throws KeeperException, InterruptedException {
//1.获取 /servers 节点下所有的子节点信息,并且对/servers节点进行监听
List<String> children = clientZk.getChildren(parentNode, true);
//2.遍历所有节点,获取节点中的信息
ArrayList<String> servers = new ArrayList<String>();
for (String child: children) {
byte[] data = clientZk.getData(parentNode + "/" + child, false, null);
String s = data.toString();
servers.add(s);
System.out.println("sssssssssssssss=>"+s);
}
//3.打印服务器列表信息
System.out.println("服务器列表信息:"+servers);
}
// 业务功能
private void business() throws Exception{
System.out.println("客户端正在工作...");
Thread.sleep(Long.MAX_VALUE);
}
}
生产者:
package com.wyz.zk;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class Server {
//zk集群地址
private static String connentStr ="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
//session 超时(毫秒)
private static int sessionTimeout =4000;
//父node 节点
private String parentNode ="/servers";
//zk对象
private ZooKeeper clientZk = null;
public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
Server server = new Server();
//todo 1.初始化zk客户端对象
server.init();
//todo 2.判断zk中存储服务器信息的node是否存在
server.parentNodeExists();
//todo 3.将服务器的信息写入到zk中
server.writeServer("wyz");
//todo 4.保持线程不结束
Thread.sleep(Long.MAX_VALUE);
}
//todo 1.初始化zk客户端对象
private void init() throws IOException {
clientZk = new ZooKeeper(connentStr, sessionTimeout, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//todo 监听事件 处理
}
});
}
//todo 2.判断zk中存储服务器信息的node是否存在
private void parentNodeExists() throws KeeperException, InterruptedException {
Stat parentNodeStat = clientZk.exists(parentNode, false);
if(parentNodeStat == null){
//创建永久的父节点
clientZk.create(parentNode,"servers".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
}
//todo 3.将服务器的信息写入到zk中
private void writeServer(String hostName) throws KeeperException, InterruptedException {
String nodePath = parentNode+"/server";
byte[] nodeContent = hostName.getBytes();
//创建临时节点
String s = clientZk.create(nodePath, nodeContent, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println("-----------------服务器:"+s+"上线了-----------------------");
}
}