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