生产-消费者队列,用于多节点的分布式数据结构,生产和消费数据。生产者创建一个数据对象,并放到队列中;消费者从队列中取出一个数据对象并进行处理。在ZooKeeper中,队列可以使用一个容器节点下创建多个子节点来实现;创建子节点时,CreateMode使用 PERSISTENT_SEQUENTIAL,ZooKeeper会自动在节点名称后面添加唯一序列号。EPHEMERAL_SEQUENTIAL也有同样的特点,区别在于会话结束后是否会自动删除。

敲小黑板:*_SEQUENTIAL是ZooKeeper的一个很重要的特性,分布式锁、选举制度都依靠这个特性实现的。

1      对前续代码的重构

之前的文章,我们已经用实现了Watcher和Barrier,创建ZooKeeper连接的代码已经复制了一遍。后续还需要类似的工作,因此先对原有代码做一下重构,让代码味道干净一点。

以下是 process(WatchedEvent)的代码

final public void process(WatchedEvent event) {if (Event.EventType.None.equals(event.getType())) {// 连接状态发生变化if (Event.KeeperState.SyncConnected.equals(event.getState())) {// 连接建立成功connectedSemaphore.countDown();}} else if (Event.EventType.NodeCreated.equals(event.getType())) {processNodeCreated(event);} else if (Event.EventType.NodeDeleted.equals(event.getType())) {processNodeDeleted(event);} else if (Event.EventType.NodeDataChanged.equals(event.getType())) {processNodeDataChanged(event);} else if (Event.EventType.NodeChildrenChanged.equals(event.getType())) {processNodeChildrenChanged(event);}
}

以ZooKeeperBarrier为例,看看重构之后的构造函数和监听Event的代码

ZooKeeperBarrier(String address, String tableSerial, int tableCapacity, String customerName)throws IOException {super(address);this.tableSerial = createRootNode(tableSerial);this.tableCapacity = tableCapacity;this.customerName = customerName;
}
protected void processNodeChildrenChanged(WatchedEvent event) {log.info("{} 接收到了通知 : {}", customerName, event.getType());// 子节点有变化synchronized (mutex) {mutex.notify();}
}

2 队列的生产者

生产者的关键代码

String elementName = queueName + "/element";
ArrayList<ACL> ids = ZooDefs.Ids.OPEN_ACL_UNSAFE;
CreateMode createMode = CreateMode.PERSISTENT_SEQUENTIAL;
getZooKeeper().create(elementName, value, ids, createMode);

注意,重点是PERSISTENT_SEQUENTIAL,PERSISTENT是表示永久存储直到有命令删除,SEQUENTIAL表示自动在后面添加自增的唯一序列号。这样,尽管elementName都一样,但实际生成的zNode名字在 “element”后面会添加格式为%010d的10个数字,如0000000001。如一个完整的zNode名可能为/queue/element0000000021。

3 队列的消费者

消费者尝试从子节点列表获取zNode名最小的一个子节点,如果队列为空则等待

最后

由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!有需要的程序猿(媛)可以帮忙点赞+点击【学习资料】即可免费领取!

img-w206dpt0-1626950006218)]

[外链图片转存中…(img-VqexZh3C-1626950006220)]

web开发首选,CSS常用五类选择器相关推荐

  1. CSS常用五类选择器

    要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. ㈠什么是选择器? 每一条css样式定义由两部分组成,形式如下: [code] 选择器{样式} [/co ...

  2. CSS常用五类选择器,经典好文

    前言 腾讯的面试凉了,接着开始面试网易 网易的面试体验挺不错.它的微信公众号会给你叫号,前台小姐姐也会提醒你,每一面结束后都可以找前台小姐姐查询面试结果.而且食堂超级好吃!还可以边吃饭边吸猫!面试地点 ...

  3. CSS常用伪类选择器详解

    1. 用户行为伪类 1.1 :hover selector:hover 表示匹配鼠标经过的selector选择器元素. 应用场景: 鼠标经过元素时的样式变化,Tips提示,下拉列表和过渡动画等 细节优 ...

  4. Css 结构伪类选择器

    目录 Css 结构伪类选择器 结构伪类-公式 Css 结构伪类选择器 在日常开发中,结构伪类选择器用的还是比较多的熟练的使用它,可以让我们的代码更整洁. 作用与优势: 作用:根据元素在HTML中的结构 ...

  5. 使用css伪类选择器,css的伪类选择器的使用

    伪类选择器,在不同情况下显示的css,伪类选择器在处理页面的美观是很大帮助.其实很多美丽的按钮或者页面都是有这些基础的知识实现的,掌握好基础很重要. 名字 实例 说明 :link a:link 选择所 ...

  6. 了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发)...

    了不起的Node.js: 将JavaScript进行到底(Web开发首选,实时,跨多服务器,高并发) Guillermo Rauch 编   赵静 译 ISBN 978-7-121-21769-2 2 ...

  7. html伪类选择器focus,了解CSS :focus-within伪类选择器

    一.了解CSS :focus-within伪类选择器 CSS :focus-within伪类选择器和IE8就开始支持的:focus可以说是近亲,区别在于:focus表示当前元素处于focus状态时候干 ...

  8. web前端html+css常用布局05列表布局

    web前端html+css常用布局05列表布局 注意:引入jquery的jquery-2.1.4.min.js包 图片从自己目录中路径. 代码: <!DOCTYPE html> <h ...

  9. Web前端,CSS常用之相对定位和绝对定位的区别,静态定位、子绝父相、固定定位、元素的层级关系的了解

    前言 持续学习总结输出中,今天分享的是Web前端,CSS常用之相对定位和绝对定位的区别,静态定位.子绝父相.固定定位.元素的层级关系的了解 1.定位的基本介绍 我们的网页常见布局方式有:标准流.浮动. ...

最新文章

  1. matlab 非线性曲线拟合
  2. scip 练习2.18
  3. 轉Excel的一種簡單方法
  4. swift 去json空格_数字货币为什么要去中心化?好处是什么?
  5. android unity hid,Unity5.X与Arduino交互
  6. tf.train.Saver,和模型参数微调
  7. 安装配置MySQL5.7详细教程
  8. 微信小程序大家来找茬 ,快速通过方法
  9. 洞道干燥及计算机控制实验报告,洞道干燥实验思考题
  10. 利用STM32精确测量电压
  11. Android cer转bks
  12. latex如何设置页面边框
  13. MSP430单片机中断学习笔记(一)
  14. 2022 199管综真题及答案解析
  15. python数据框元素的性质_Pandas基础:文件读取与写入、Series和Dataframe、常用基本函数、排序...
  16. 改进的RANSAC算法实现点云粗配准
  17. 日语汉字上面标注平假名
  18. Transformer 实现 Kaggle 房价预测竞赛
  19. Unity3D将物体的所有子物体设置为半透明
  20. matlab中的且怎么表达,新人求问!MATLAB中如何实现编辑距离并求相似度,且遍历输出成矩...

热门文章

  1. 使用 Python 和 Streamlit 从 Excel 中进行 VLOOKUP
  2. oracle数据库offline,oracle中删除offline状态的数据文件
  3. 关于XML文档的讲解
  4. java编辑器的使用_java代码编辑器的使用方法
  5. 矩阵范数(martix norm) --维基百科
  6. mlr3实战 | 基于临床参数的肝病患者分类(7种常用的机器学习方法)
  7. phtoshop理解与备忘
  8. 浏览器IE6、IE7、IE8、css bug兼容性处理
  9. iOS根据月日计算星座
  10. Android源码目录结构,已获千赞