使用ZooKeeper实现的FIFO队列,这个队列是分布式的。

package fifo;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
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.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
/*** 使用ZooKeeper实现的FIFO队列* @author lisg**/
public class ZKFIFO {private static final String HOSTS = "vm1";private ZooKeeper zk = null;private static final String PARENT_PATH = "/fifo";private static final String SEQ_PREFIX = "seq-";public ZKFIFO() {try {final CountDownLatch cdl = new CountDownLatch(1);zk = new ZooKeeper(HOSTS, 5000, new Watcher() {@Overridepublic void process(WatchedEvent event) {if(KeeperState.SyncConnected.equals(event.getState())) {cdl.countDown();}}});cdl.await();//创建父节点Stat stat = zk.exists(PARENT_PATH, false);if(stat == null) {zk.create(PARENT_PATH, "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);}} catch (Exception e) {System.out.println("zookeeper集群连接失败!");e.printStackTrace();}}/*** 在父节点下创建顺序子节点* @param data*/public void push(String data) {if(data == null) {data = "";}try {zk.create(PARENT_PATH + "/" + SEQ_PREFIX, data.getBytes("UTF-8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);} catch (Exception e) {e.printStackTrace();}}/*** 删除字第一个子节点,并返回它的值* @return*/public String pop() {try {final List<String> children = zk.getChildren(PARENT_PATH, false);if(children.isEmpty()) {return null;}Collections.sort(children);String firstChildPath = PARENT_PATH + "/" + children.get(0);final byte[] data = zk.getData(firstChildPath, false, null);zk.delete(firstChildPath, -1);return new String(data, "UTF-8");} catch (Exception e) {e.printStackTrace();}return null;}public void close() {try {this.zk.close();} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {final ZKFIFO fifo = new ZKFIFO();/*for(int i=0; i<10; i++) {new Thread() {public void run() {fifo.push("data-" + UUID.randomUUID().toString().replace("-", ""));};}.start();}*/System.out.println(fifo.pop());fifo.close();}
}

  

需要改进的地方:
1)zookeeper异常处理、重试

转载于:https://www.cnblogs.com/lishouguang/p/4558977.html

zookeeper应用 - FIFO 队列 分布式队列相关推荐

  1. zookeeper教程,docker 安装,命令,python操作zookeeper,分布式队列,分布式锁

    docker安装zookeeper服务端 首先安装单节点的服务端,如果安装多节点的服务端,需要为每个节点配置其他节点的地址. docker run --privileged=true -d --nam ...

  2. 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列

    前言 上文[从入门到放弃-ZooKeeper]ZooKeeper入门中,我们学习了ZooKeeper的简单安装和cli使用. 接下来我们开始基于java API的实战编程.本文先来写一个分布式队列的代 ...

  3. 使用Zookeeper共享锁和排它锁和分布式队列的原理和实现(ZkClient)

    简介 当我们分布式系统中多个节点需要访问同一共享数据,就需要加一把分布式锁,因为如果是同一进程的线程的话,完全可以采用Java的同步锁实现,但是这是多进程间的锁,所以就需要一个协调者来协调进程间的通信 ...

  4. 使用ZooKeeper实现分布式队列、分布式锁和选举详解

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/qq_40378034/ article/details/117014648 ZooKeeper源码的zookeeper-rec ...

  5. 分布式队列编程:模型、实战

    介绍 作为一种基础的抽象数据结构,队列被广泛应用在各类编程中.大数据时代对跨进程.跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在.但是,这种常见的基础性的事物往往容易被忽 ...

  6. 分布式队列编程优化篇

    "分布式队列编程"是一个系列文,之前我们已经发布了<分布式队列编程模型.实战>,主要剖析了分布式队列编程模型的需求来源.定义.结构以及其变化多样性:根据作者在新美大实际 ...

  7. 多核分布式队列的实现:“偷”与“自私”的运用(4)

    6. CDistributedQueue源代码 在设计CDistributeQueue类时,通常有两种方案值得考虑: 1. 本地队列预先创建好,当有线程访问时就可以直接根据线程编号去访问对应的本地队列 ...

  8. 多核分布式队列的实现:“偷”与“自私”的运用(1)

    多核分布式队列的实现:"偷"与"自私"的运用 在讨论本文的正题前,不得不先说一些闲话,嫌哆嗦者可以跳过"前言"部分不读. 1. 前言 在发表 ...

  9. 微信开源PhxQueue:高可用、高可靠、高性能的分布式队列**

    消息队列概述 消息队列作为成熟的异步通信模式,对比常用的同步通信模式,有如下优势: 解耦:防止引入过多的 API 给系统的稳定性带来风险:调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低 ...

最新文章

  1. 机器学习(11)线性回归(1)理论:损失函数(含最小二乘法)、正规方程、梯度下降、回归性能评估(均方差)
  2. synology_用于在Synology NAS上测试Spring Boot Web应用程序的JUnit模拟文件
  3. python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
  4. 电脑壁纸知乎_电脑壁纸(个人向
  5. linux db2 归档,DB2的归档模式设置方法
  6. 数据 + 代码,基于 Keras 的烟火检测
  7. 【课程作业】EA-CNN演化卷积神经网络实验记录
  8. 一道不知道哪里来的贪心题
  9. android js桥接,一种JavaScript和原生APP之间数据交互方法与流程
  10. Ring3加载驱动源码
  11. k近邻算法的原理、示例与分析
  12. Cant open /dev/sdb1exclusively.Mounted filesystem
  13. Wondows Sever 2003密钥【收集】
  14. 微信小程序-弹出自定义对话框
  15. 阿里云上发布自己的网站的方法
  16. c语言编程票务系统,C语言课程设计票务管理系统
  17. 010Editor破解版png模板失效解决方法
  18. hdu 2006 求奇数的乘积
  19. 职高计算机工作总结范文,职高学习工作总结范文2000字
  20. 使用宝塔在Linux安装墨子系统教程

热门文章

  1. 唯一索引和逻辑删除冲突
  2. Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout
  3. mycat核心配置详解(schema.xml配置)
  4. Selenium 对元素element的操作举例
  5. 数据结构与算法之KMP算法中Next数组代码原理分析
  6. Python之网络编程(Socket)
  7. 【Swift 4.0】扩展 WCDB 支持 SQL 语句
  8. If you insist running as root, then set the environment variable RUN_AS_USER=root...
  9. android 记录崩溃日志
  10. [原创] Wireshark工具培训