15 ZooKeeper 使用非同步API獲取子節點列表
阿新 • • 發佈:2021-01-27
技術標籤:Zookeeperzookeeperzk非同步方法使用zk非同步方法示例AsyncCallback
程式碼示例
package learn.zk.base; import org.apache.zookeeper.AsyncCallback; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import org.apache.zookeeper.data.Stat; import java.util.List; import java.util.concurrent.CountDownLatch; /** * @PackageName : learn.zk.base * @ClassName : Zk_GetChildren_API_ASync * @Author : LingYi * @Date : 2021/1/26 20:32 * @Description : 使用非同步API獲取子節點列表 */ public class Zk_GetChildren_API_ASync implements Watcher { /** * zookeeper地址 */ static final String CONNECT_ADDR = "192.168.31.207:2181,192.168.31.244:2181,192.168.31.212:2181"; /** * session超時時間 */ static final int SESSION_OUT_TIME = 4000;//ms /** * 訊號量,阻塞程式執行,用於等待zookeeper連線成功,傳送成功訊號 */ static final CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws Exception { ZooKeeper zk = new ZooKeeper(CONNECT_ADDR, SESSION_OUT_TIME, new Zk_GetChildren_API_ASync()); connectedSemaphore.await(); System.out.println("......"); /** * path: 路徑 * watch:是否註冊watch * ZkChildrenASync:回撥方法 * Object:傳遞一個上下文 **/ zk.getChildren("/", true, new ZkChildrenASync(), "Context"); zk.close(); } @Override public void process(WatchedEvent event) { if (Event.KeeperState.SyncConnected == event.getState() && Event.EventType.None == event.getType()) { //如果建立連線成功,則傳送訊號量,讓後續阻塞程式向下執行 connectedSemaphore.countDown(); System.out.println("zk 建立連線"); } } } /** * @PackageName : learn.zk.base * @ClassName : ZkChildrenASync * @Description : 非同步回撥 */ class ZkChildrenASync implements AsyncCallback.Children2Callback { @Override public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) { System.out.println("rc:" + rc + ",path:" + path + ",ctx:" + ctx.toString() + ",children:" + children + ",stat:" + stat); } }
執行結果: