zookeeper学习之一

zookeeper 学习

关于 zookeeper监控

当监控的节点下面数据 增加或者减少。 客户端可以通过监控第一时间观察到节点变化,可用于集群的负载均衡作用。新机器加入的时候在 zk里面添加节点,watcher可以观察到,出现宕机情况,客户端也可以收到信息,避免向 该服务端发起请求。

测试代码如下

package zookeeper.zookeeper;

import org.apache.log4j.Logger;
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.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 * 
 */
public class ZookeeperContext {
	protected static org.slf4j.Logger logger = LoggerFactory.getLogger("zk");

	public final int SESSION_TIME_OUT = 2000;
	public ZooKeeper zk;

	/**
	 * 判断zk的链接链接状态
	 * */
	public boolean isConnected() {
		return zk.getState() == ZooKeeper.States.CONNECTED;
	}

	/**
	 * 创建zk链接
	 * @return 
	 * **/
	public  ZookeeperContext(String connectString) {
		try {
			/**
			 * connectString 链接zookeeper的Ip和端口,多个用逗号隔开例如:
			 * 10.0.0.104:2181,10.0.0.105:2181 sessionTimeout
			 * 客户端和zookeeper链接断开后,数据最长保存的时间 watcher 监控回调,服务器数据修改会回调
			 */
			zk = new ZooKeeper(connectString, SESSION_TIME_OUT,
					new ZookeeperWatcher());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * zk监听,如果服务器端有什么变化到这里接收 并继续添加监听
	 * */
	public class ZookeeperWatcher implements Watcher {
		public void process(WatchedEvent event) {
			try {

				if (null != event.getPath()) {
					System.out.println(event);
					if (event.getType() == EventType.NodeChildrenChanged) {
						zk.getChildren(event.getPath(), true).get(1);
						byte[] bytes = zk.getData("/root/hpgary", null, null);
						 
						 System.out.println(new String(bytes));
						System.out.println(zk.getChildren(event.getPath(), true)+"11");
					} else {
						zk.getData(event.getPath(), true, null);
						System.out.println(zk.getData(event.getPath(), true, null));
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 在zk创建数据
	 * */
	public void setData(String path, byte[] data, CreateMode createMode) {
		try {
			if (zk.exists(path, false) == null) {
				zk.create(path, data, Ids.OPEN_ACL_UNSAFE, createMode);
			} else {
				zk.setData(path, data, -1);
			}
			zk.getChildren(path, true);
		} catch (Exception e) {
			logger.error("setData", e);
		}
	}

	public static void main(String[] args) throws Exception {
		ZookeeperContext context = new ZookeeperContext("192.168.80.103:2181");

		while (!context.isConnected()) {
			Thread.sleep(3000);
		}
		context.setData("/root", "1".getBytes(), CreateMode.PERSISTENT);
		System.out.println("1执行完了");
		context.setData("/root/hpgary", "gg".getBytes(), CreateMode.EPHEMERAL);
		System.out.println("2执行完了");
		 
		System.in.read();
		System.out.println("end");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值