基於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 (; ; ) {
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章