以服务动态上下线通知为例

Client 监听服务器状态

  1. public class DistributeClient {
  2.  
  3. private String connectString = "127.0.0.1:2181";
  4. private int sessionTimeout = 2000;
  5. private ZooKeeper zkClient;
  6.  
  7. public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
  8. BasicConfigurator.configure();
  9. DistributeClient client = new DistributeClient();
  10. // 获取 zookeeper 集群连接
  11. client.getConnect();
  12. // 注册监听
  13. client.getChlidren();
  14. Thread.sleep(Long.MAX_VALUE);
  15. }
  16.  
  17. private void getConnect() throws IOException {
  18. zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
  19. @Override
  20. public void process(WatchedEvent event) {
  21. try {
  22. // 具体监听业务
  23. getChlidren();
  24. } catch (KeeperException e) {
  25. e.printStackTrace();
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. });
  31. }
  32.  
  33. private void getChlidren() throws KeeperException, InterruptedException {
  34. if (zkClient.exists("/servers", false) == null) {
  35. zkClient.create("/servers", "server".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
  36. }
  37. // 监听 /servers 节点
  38. List<String> children = zkClient.getChildren("/servers", true);
  39. // 存储服务器节点主机名称集合
  40. ArrayList<String> hosts = new ArrayList<>();
  41. for (String child : children) {
  42. // 获取节点内容,即主机名称
  43. byte[] data = zkClient.getData("/servers/" + child, false, null);
  44. hosts.add(new String(data));
  45. }
  46. System.out.println("在线主机:" + hosts);
  47. }
  48. }

Server 服务器,上线后 Client 端会收到通知

  1. public class DistributeServer {
  2.  
  3. private String connectString = "127.0.0.1:2181";
  4. private int sessionTimeout = 2000;
  5. private ZooKeeper zkClient;
  6.  
  7. public static void main(String[] args) throws Exception {
  8. BasicConfigurator.configure();
  9. DistributeServer server = new DistributeServer();
  10. // 连接 zookeeper 集群
  11. server.getConnect();
  12. // 注册节点
  13. server.regist(UUID.randomUUID().toString());
  14. Thread.sleep(Long.MAX_VALUE);
  15. }
  16.  
  17. private void getConnect() throws IOException {
  18. zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
  19. @Override
  20. public void process(WatchedEvent event) {
  21. // TODO Auto-generated method stub
  22. }
  23. });
  24. }
  25.  
  26. private void regist(String hostname) throws KeeperException, InterruptedException {
  27. // 创建临时带序号节点
  28. zkClient.create("/servers/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
  29. System.out.println(hostname + ":上线");
  30. }
  31. }

测试

1.直接运行 Client

2.运行 Server 后再查看 Client 的控制台

3.关闭  Server 后再查看 Client 的控制台


http://zookeeper.apache.org/doc/r3.4.14/javaExample.html

https://my.oschina.net/u/164027/blog/1921308

ZooKeeper-API 监听的更多相关文章

  1. zookeeper事件监听

    原来有两张表,一张是公司的,一张的产品的,项目中用来查询,不需要增删改.现在增删改交给另一项目去维护,由他们变更时同步数据到zk,我们去取.很明显,这里需要一个监听器,每次他项目发起数据变更时,我方必 ...

  2. 8.7.ZooKeeper Watcher监听

    1.ZooKeeper Watcher ZooKeeper 提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订阅者同时监听某一个主题对象, 当这个主题对 ...

  3. zookeeper的监听

    统一配置管理.统一命名服务.分布式锁.集群管理

  4. ZooKeeper(3.4.5) 使用Curator监听事件

    转载:http://www.mamicode.com/info-detail-494364.html 标签: ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher ...

  5. ZooKeeper(3.4.5) - 使用 Curator(2.7.0) 监听事件

    ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher通知是一次性的,因此开发过程中需要反复注册Watcher,比较繁琐.Curator引入了Cache来监听Zoo ...

  6. Zookeeper Curator 事件监听 - 秒懂

    目录 写在前面 1.1. Curator 事件监听 1.1.1. Watcher 标准的事件处理器 1.1.2. NodeCache 节点缓存的监听 1.1.3. PathChildrenCache ...

  7. 如何使用Curator监听zookeeper事件变化

    掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括: 1,配置文件同步 2,主从切换 3,分布式队 ...

  8. ZooKeeper监听机制

    前言:Zookeeper的监听机制很多人都踩过坑,感觉实现了watcher 接口,后面节点的变化都会一一推送过来,然而并非如此. Watch机制官方声明:一个Watch事件是一个一次性的触发器,当被设 ...

  9. 基于Zookeeper实现客户端动态监听服务器上下线

    一.在具体实现之前,先来了解一下Zookeeper的监听器的原理: 图中Main()线程作为客户端,当在主线程中创建Zookeeper客户端时,会默认创建两个子线程:Listener和connect, ...

  10. 8、Curator的监听机制

    原生的zookeeper的监听API所实现的方法存在一些缺点,对于开发者来说后续的开发会考虑的细节比较多. Curator所实现的方法希望摒弃原声API 的不足,是开发看起来更加的简单,一些重连等操作 ...

随机推荐

  1. DVWA-命令执行学习笔记

    DVWA-命令执行 原理: web服务器没有对用户提交的数据进行严格的过滤,造成调用操作系统的命令或者在操作系统恶意拼接拼接命令,以达到攻击者的目的. 1.将DVWA的级别设置为low 1.2查看源代 ...

  2. Linux Mint chrome浏览器提示“需要安装adobe flash player”

    出现这种情况,是因为系统没有安装flash 插件造成的,用以下的命令安装: sudo apt-get install adobe-flashplugin 安装完成后,重启浏览器. 如果chrome浏览 ...

  3. Ubuntu 18.04中截图工具Shutter的编辑按钮不可用的解决办法

    Shutter是一个由第三方提供的在Ubuntu上运行的截图工具,相对于系统自带的截图工具(默认可通过Ctrl + Shift + Print快捷键启动截图),最大的优点就是可以即时对图片进行编辑,在 ...

  4. C#:往数据库插入/更新时候关于NUll空值的处理

    前几天遇到一个问题,找了好久才找到解决办法.不过也很开心,终于解决了. 问题:前端当我数据为空的时候不赋值,传到后台也为空的时候(注意:是Null不是""),SqlCommand对 ...

  5. zookeeper 分布式锁原理

    zookeeper 分布式锁原理: 1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布式场景中我们会面临多个Server之间的锁的问题,实现的复杂度比较高.利用基于googl ...

  6. In action "Setting JDBC driver jar location unix [Set a variable]" (screen "Select a Database [Configurable banner form]"), property "Script":

    java.lang.Exception: JDBC Driver Jar not found. Looking for: /u01/oracle/GG_Director/ERROR: Unresolv ...

  7. 2013年山东省赛F题 Mountain Subsequences

    2013年山东省赛F题 Mountain Subsequences先说n^2做法,从第1个,(假设当前是第i个)到第i-1个位置上哪些比第i位的小,那也就意味着a[i]可以接在它后面,f1[i]表示从 ...

  8. C#字符串和ASCII码的转换

    //字符转ASCII码: public static int Asc(string character) { if (character.Length == 1) { System.Text.ASCI ...

  9. Python并发式编程

    目录 进程 线程 GIL(Global Interpreter Lock) 线程的调用方式 直接调用 继承调用 join&Daemon方法 Daemon(True) 同步锁 死锁 递归锁 同步 ...

  10. bugku crypto easy-crypto

    长度不一的01字符串 就要考虑是不是摩斯密码 用这个py脚本: from __future__ import print_function a = input("input the stri ...