zookeeper应用

服务器端:监听zk上父节点的子节点变化

  1. package monitor;
    import java.util.List;
    import java.util.concurrent.CountDownLatch;
    import java.util.concurrent.TimeUnit;
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.Watcher.Event.KeeperState;
    import org.apache.zookeeper.ZooDefs;
    import org.apache.zookeeper.ZooKeeper;
    /**
     * 监听客户端的上下线
     * @author lisg
     *
     */
    public class ServerMonitor {
    	public static final String HOSTS = "vm1";
    	private ZooKeeper zk = null;
    	
    	public static final String PARENT_PATH = "/monitor";
    	
    	private static int client_count = 0;
    	public ServerMonitor() {
    		final CountDownLatch cdl = new CountDownLatch(1);
    		try {
    			zk = new ZooKeeper(HOSTS, 5000, new Watcher() {
    				@Override
    				public void process(WatchedEvent event) {
    					if(KeeperState.SyncConnected.equals(event.getState())) {
    						cdl.countDown();
    					}
    				}
    			});
    			
    			cdl.await();
    			
    			//创建父节点
    			if(zk.exists(PARENT_PATH, false) == null) {
    				zk.create(PARENT_PATH, 
    						"".getBytes(), 
    						ZooDefs.Ids.OPEN_ACL_UNSAFE, 
    						CreateMode.PERSISTENT);
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	public void run() {
    		try {
    			zk.getChildren(PARENT_PATH, new ClientChangeWatcher());
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    	class ClientChangeWatcher implements Watcher {
    		@Override
    		public void process(WatchedEvent event) {
    			try {
    				if(Event.EventType.NodeChildrenChanged.equals(event.getType())) {
    					//获取子节点,同时注册监听
    					final List<String> children = zk.getChildren(PARENT_PATH, this);
    					if(client_count > children.size()) {
    						System.out.println("有客户端下线");
    					} else {
    						System.out.println("有客户端上线");
    					}
    					client_count = children.size();
    				}
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public static void main(String[] args) {
    		new ServerMonitor().run();
    		
    		try {
    			TimeUnit.DAYS.sleep(1);
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
    	}
    }
    

      

 
客户端:上线的时候在父节点上创建短暂的子节点
 
package monitor;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
/**
 * 客户端
 * 上线的时候在zk上创建一个短暂的子节点
 * @author lisg
 *
 */
public class Client {
	
	public static final String CLIENT_PATH_PREFIX = "cli-";
	public static void main(String[] args) {
		final CountDownLatch cdl = new CountDownLatch(1);
		try {
			ZooKeeper zk = new ZooKeeper(ServerMonitor.HOSTS, 5000, new Watcher() {
				@Override
				public void process(WatchedEvent event) {
					if(KeeperState.SyncConnected.equals(event.getState())) {
						cdl.countDown();
					}
				}
			});
			
			cdl.await();
			
			//创建父节点
			zk.create(ServerMonitor.PARENT_PATH + "/" + CLIENT_PATH_PREFIX, 
					"".getBytes(), 
					Ids.OPEN_ACL_UNSAFE, 
					CreateMode.EPHEMERAL_SEQUENTIAL);
			
			TimeUnit.SECONDS.sleep(5);
			zk.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

  





附件列表

原文地址:https://www.cnblogs.com/lishouguang/p/4558967.html