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