zookeeper应用 - FIFO 队列 分布式队列
使用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();}
}
转载于:https://www.cnblogs.com/lishouguang/p/4558977.html
zookeeper应用 - FIFO 队列 分布式队列相关推荐
- zookeeper教程,docker 安装,命令,python操作zookeeper,分布式队列,分布式锁
docker安装zookeeper服务端 首先安装单节点的服务端,如果安装多节点的服务端,需要为每个节点配置其他节点的地址. docker run --privileged=true -d --nam ...
- 【从入门到放弃-ZooKeeper】ZooKeeper实战-分布式队列
前言 上文[从入门到放弃-ZooKeeper]ZooKeeper入门中,我们学习了ZooKeeper的简单安装和cli使用. 接下来我们开始基于java API的实战编程.本文先来写一个分布式队列的代 ...
- 使用Zookeeper共享锁和排它锁和分布式队列的原理和实现(ZkClient)
简介 当我们分布式系统中多个节点需要访问同一共享数据,就需要加一把分布式锁,因为如果是同一进程的线程的话,完全可以采用Java的同步锁实现,但是这是多进程间的锁,所以就需要一个协调者来协调进程间的通信 ...
- 使用ZooKeeper实现分布式队列、分布式锁和选举详解
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/qq_40378034/ article/details/117014648 ZooKeeper源码的zookeeper-rec ...
- 分布式队列编程:模型、实战
介绍 作为一种基础的抽象数据结构,队列被广泛应用在各类编程中.大数据时代对跨进程.跨机器的通讯提出了更高的要求,和以往相比,分布式队列编程的运用几乎已无处不在.但是,这种常见的基础性的事物往往容易被忽 ...
- 分布式队列编程优化篇
"分布式队列编程"是一个系列文,之前我们已经发布了<分布式队列编程模型.实战>,主要剖析了分布式队列编程模型的需求来源.定义.结构以及其变化多样性:根据作者在新美大实际 ...
- 多核分布式队列的实现:“偷”与“自私”的运用(4)
6. CDistributedQueue源代码 在设计CDistributeQueue类时,通常有两种方案值得考虑: 1. 本地队列预先创建好,当有线程访问时就可以直接根据线程编号去访问对应的本地队列 ...
- 多核分布式队列的实现:“偷”与“自私”的运用(1)
多核分布式队列的实现:"偷"与"自私"的运用 在讨论本文的正题前,不得不先说一些闲话,嫌哆嗦者可以跳过"前言"部分不读. 1. 前言 在发表 ...
- 微信开源PhxQueue:高可用、高可靠、高性能的分布式队列**
消息队列概述 消息队列作为成熟的异步通信模式,对比常用的同步通信模式,有如下优势: 解耦:防止引入过多的 API 给系统的稳定性带来风险:调用方使用不当会给被调用方系统造成压力,被调用方处理不当会降低 ...
最新文章
- 机器学习(11)线性回归(1)理论:损失函数(含最小二乘法)、正规方程、梯度下降、回归性能评估(均方差)
- synology_用于在Synology NAS上测试Spring Boot Web应用程序的JUnit模拟文件
- python爬虫多久能学会-不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据...
- 电脑壁纸知乎_电脑壁纸(个人向
- linux db2 归档,DB2的归档模式设置方法
- 数据 + 代码,基于 Keras 的烟火检测
- 【课程作业】EA-CNN演化卷积神经网络实验记录
- 一道不知道哪里来的贪心题
- android js桥接,一种JavaScript和原生APP之间数据交互方法与流程
- Ring3加载驱动源码
- k近邻算法的原理、示例与分析
- Cant open /dev/sdb1exclusively.Mounted filesystem
- Wondows Sever 2003密钥【收集】
- 微信小程序-弹出自定义对话框
- 阿里云上发布自己的网站的方法
- c语言编程票务系统,C语言课程设计票务管理系统
- 010Editor破解版png模板失效解决方法
- hdu 2006 求奇数的乘积
- 职高计算机工作总结范文,职高学习工作总结范文2000字
- 使用宝塔在Linux安装墨子系统教程
热门文章
- 唯一索引和逻辑删除冲突
- Android开发笔记(一百二十三)下拉刷新布局SwipeRefreshLayout
- mycat核心配置详解(schema.xml配置)
- Selenium 对元素element的操作举例
- 数据结构与算法之KMP算法中Next数组代码原理分析
- Python之网络编程(Socket)
- 【Swift 4.0】扩展 WCDB 支持 SQL 语句
- If you insist running as root, then set the environment variable RUN_AS_USER=root...
- android 记录崩溃日志
- [原创] Wireshark工具培训