基于Zookeeper客户端Curator监听节点上下线

Apache Curator是ZooKeeper的Java客户端库,提供高级API和实用工具,简化了ZooKeeper的使用。该文通过代码示例展示了如何利用Curator监听Zookeeper节点的上下线事件。

Apache Curator是Apache ZooKeeper(一种分布式协调服务)的Java/JVM客户端库。它包含一个高级的API框架和实用程序,使Apache ZooKeeper的使用更加容易和可靠。它还包括常见用例和扩展(如服务发现和Java 8异步DSL)的方法。 

效果展示:

代码如下:

package ha;

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

import java.util.List;

/**
 * @ClassName: CuratorServiceDiscover
 * @Description: 
 * @Author: xuezhouyi
 * @Version: V1.0
 **/
public class CuratorServiceDiscover implements Watcher {
	final private String path = "/zk";
	private CuratorFramework client;
	private List<String> children;

	public CuratorServiceDiscover() {
		try {
			client = CuratorFrameworkFactory
							.builder()
							.connectString("hadoop:2181")
							.retryPolicy(new ExponentialBackoffRetry(1000, 3))
							.build();

			/* 使用前必须启动 */
			client.start();

			/* 获取初始节点列表 */
			children = client.getChildren().usingWatcher(this).forPath(path);
			System.out.println("初始监听目录节点列表:" + children);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Override
	public void process(WatchedEvent event) {
		try {
			/* 获取最新节点列表 */
			final List<String> newChildren = client.getChildren().usingWatcher(this).forPath(path);

			/* 新节点列表大于旧节点列表,说明有节点上线,反之有节点下线 */
			if (newChildren.size() > children.size()) {
				for (String child : newChildren) {
					/* 取出旧节点列表中不包含新节点,即为上线 */
					if (!children.contains(child)) {
						System.out.println("上线节点:" + child);
					}
				}
			} else {
				for (String child : children) {
					/* 取出新节点列表中不包含旧节点,即为下线 */
					if (!newChildren.contains(child)) {
						System.out.println("下线节点:" + child);
					}
				}
			}

			/* 更新节点列表 */
			children = newChildren;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		CuratorServiceDiscover csd = new CuratorServiceDiscover();
		csd.start();
	}

	private void start() {
		for (; ; ) {
		}
	}
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值