zk-FIFO简介

1 FIFO思路:



 

2 代码:  

zk中创建顺序持久节点/queue-fifo/1......n, 消费时,得到/queue-fifo/的孩子,依次删除编号最小的

这样实现了FIFO效果。

1 创建文件夹 后在创建子节点  注意创建文件夹后 需要将此代码注释掉在创建子节点

public static void main(String[] args) throws Exception {
		// 一旦连接上了zk 就调动此方法
		Watcher watcher = new Watcher(){
			@Override
			public void process(WatchedEvent event) {
				System.err.println("event: " + event);
			}
			
		};
		
		// 192.168.1.110,192.168.1.111,192.168.1.112 集群IP,zk会随机连接,如果A连接不上去则尝试B地址
		ZooKeeper zk = new ZooKeeper(
				"192.168.1.110,192.168.1.111,192.168.1.112",9999,watcher);
		
		System.err.println("zk: " + zk);
		// 创建父节点   创建后在zk客户端执行结果为 : [zk-fifo, zookeeper] 创建完后注释,  注意父节点为 非有序节点 CreateMode.PERSISTENT
		//zk.create("/zk-fifo", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 
		
		// 创建子节点: 连续执行两次新建子节点 ,注意此时父节点结尾处必须要有/    执行 ls /zk-fifo 后 结果为: [0000000000, 0000000001]  子节点指定为有序节点PERSISTENT_SEQUENTIAL
		// "".getBytes() 可以是用户的IP,比如网络购票时,存入用户申请IP,交给ZK来统一管理 实现购票FIFO效果
		zk.create("/zk-fifo/", "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
		
		
		
		zk.close();
	}


2 删除子节点 并在zk 客户端查看删除结果:



// 消费 测试ZK FIFO
/**
 * 如下是方法中 父路径是否需要带尾巴/的说明:
 * 1 创建子节点    父路径: /zk-fifo/
 * 2 删除                 父路径: /zk-fifo/
 * 3 查询                 父路径: /zk-fifo
 * 
 * @author zm
 *
 */
public class zkConsume {
	

	/**
	 * @param args
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws Exception {
		// 一旦连接上了zk 就调动此方法
		Watcher watcher = new Watcher(){
			@Override
			public void process(WatchedEvent event) {
				System.err.println("event: " + event);
			}
			
		};
		
		
		// 这里不能使用接口Map 否则无法调用map.firstEntry()方法
		TreeMap<Integer,String> map = new TreeMap<Integer,String>();
		
		// 192.168.1.110,192.168.1.111,192.168.1.112 集群IP,zk会随机连接,如果A连接不上去则尝试B地址
		ZooKeeper zk = new ZooKeeper(
				"192.168.1.110,192.168.1.111,192.168.1.112",9999,watcher);
		
		List<String> children = zk.getChildren("/zk-fifo", null); // 注意获取时 父节点尾巴不需要带/  <------> 对比与创建子节点时, 父节点需要带/
		for(String child : children) {
			System.out.println(child); // 结果 0000000000 0000000001
			map.put(Integer.parseInt(child), child);
		}
		
		String firstChild = map.firstEntry().getValue();
		System.out.println("firstChild: " + firstChild);
		zk.delete("/zk-fifo/" + firstChild, -1); // -1 表示不要版本号   删除时父路径需要 / 
		
		zk.close();
	}

}

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2183855
zk