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

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 (; ; ) {
		}
	}
}
发布了54 篇原创文章 · 获赞 19 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/DataIntel_XiAn/article/details/102732839