丛网络上及视频里学习的代码稍微改编了一下, 配合自己的情况(三台zookeeper 虚拟机  HSlave1 HSlave2 HSlave3)  ,模拟server挂掉后客户端得到的通知情况.

步骤

1. 启动三个Server的线程分别代表三台Server, 每个线程对应一台Server

2. 启动客户端,可以启动许多个,也可以只启动一个

3. 将一台Server 断线(在控制台用root账户执行shutdown now ),然后重新启动但不注册

4. 将另外2台Server依序断线

Server程序如下:

package chuangzhi;import org.apache.zookeeper.*; import java.io.IOException;public class DistributedServer_HSlave2 {private static String ServerName="HSlave2";private static String connectString="HSlave2:2181";private static int sessionTimeout=30000;private static final String parentNode="/servers";private ZooKeeper zk=null;public void getConnection(){try {zk=new ZooKeeper(connectString,sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {System.out.println("path:"+watchedEvent.getPath()+"---type:"+watchedEvent.getType());try {zk.getChildren("/",true);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});} catch (IOException e) {e.printStackTrace();}}public void registerServer(String hostname) throws KeeperException, InterruptedException {if(zk.exists(parentNode,null)==null){;zk.create(parentNode,"pareth".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);}String path=zk.create(parentNode+"/server",hostname.getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);System.out.println(hostname+"is online ..."+path);}public void handleBusiness(String hostname){System.out.println(hostname+"is working...");}public static void main(String[] args) throws KeeperException, InterruptedException {DistributedServer_HSlave2 server=new DistributedServer_HSlave2();server.getConnection();server.registerServer(ServerName);server.handleBusiness(ServerName);Thread.sleep(Long.MAX_VALUE);} }

Client端的代码

package chuangzhi;import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper;import java.io.IOException; import java.util.ArrayList; import java.util.List;public class DistributedClient {private static String connectString="HSlave1:2181,HSlave2:2181,HSlave3:2181";private static int sessionTimeout=30000;private static final String parentNode="/servers";public ZooKeeper zk;//volatile高并发private volatile List<String > serverList;public void getConnection(){try {zk=new ZooKeeper(connectString,sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {try {getServerList();zk.getChildren("/",true);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}});} catch (IOException e) {e.printStackTrace();}}public void getServerList() throws KeeperException, InterruptedException {List<String> children =zk.getChildren(parentNode,true);List<String> services=new ArrayList<String>();for(String child: children){byte[] bytes=zk.getData(parentNode+"/"+child,null,null);services.add(new String(bytes));}serverList=services;System.out.println(services);}public void handleBusiness() throws InterruptedException {System.out.println("client is working...");Thread.sleep(Long.MAX_VALUE);}public static void main(String[] args) throws KeeperException, InterruptedException {DistributedClient client=new DistributedClient();client.getConnection();client.getServerList();client.handleBusiness();} }
运行结果如下

[INFO ][2017/08/09 19:48:53915][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:852)]
Socket connection established to HSlave1/192.168.100.23:2181, initiating session
[INFO ][2017/08/09 19:48:53931][org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1235)]
Session establishment complete on server HSlave1/192.168.100.23:2181, sessionid = 0x15dc6cda23f0004, negotiated timeout = 30000

#三台服务器(HSlave1 HSlave2 HSlave3)上线, 每台服务器由一个程序建立节点

[HSlave3, HSlave2, HSlave1]

#客户端上线

client is working...
[HSlave3, HSlave2, HSlave1]

# 将HSlave2关机,客户端更新服务器列表

[HSlave3, HSlave1]

[INFO ][2017/08/09 19:53:09639][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1098)]
Unable to read additional data from server sessionid 0x15dc6cda23f0004, likely server has closed socket, closing socket connection and attempting reconnect
[INFO ][2017/08/09 19:53:09898][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:975)]
Opening socket connection to server HSlave3/192.168.100.25:2181. Will not attempt to authenticate using SASL (unknown error)
[INFO ][2017/08/09 19:53:09899][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:852)]
Socket connection established to HSlave3/192.168.100.25:2181, initiating session
[INFO ][2017/08/09 19:53:09903][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1098)]
Unable to read additional data from server sessionid 0x15dc6cda23f0004, likely server has closed socket, closing socket connection and attempting reconnect
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /servers
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1472)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1500)
    at chuangzhi.DistributedClient.getServerList(DistributedClient.java:57)
    at chuangzhi.DistributedClient$1.process(DistributedClient.java:32)
    at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:522)
    at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:498)
[INFO ][2017/08/09 19:53:10583][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:975)]
Opening socket connection to server HSlave2/192.168.100.24:2181. Will not attempt to authenticate using SASL (unknown error)
[INFO ][2017/08/09 19:53:10585]

# 将HSlave2重新开机并开启zkService

[org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:852)]
Socket connection established to HSlave2/192.168.100.24:2181, initiating session
[INFO ][2017/08/09 19:53:10586][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1098)]
Unable to read additional data from server sessionid 0x15dc6cda23f0004, likely server has closed socket, closing socket connection and attempting reconnect
[INFO ][2017/08/09 19:53:11841][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:975)]
Opening socket connection to server HSlave1/192.168.100.23:2181. Will not attempt to authenticate using SASL (unknown error)
[INFO ][2017/08/09 19:53:21842][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1096)]
Client session timed out, have not heard from server in 11155ms for sessionid 0x15dc6cda23f0004, closing socket connection and attempting reconnect
[INFO ][2017/08/09 19:53:22629][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:975)]
Opening socket connection to server HSlave3/192.168.100.25:2181. Will not attempt to authenticate using SASL (unknown error)
[INFO ][2017/08/09 19:53:22630][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:852)]
Socket connection established to HSlave3/192.168.100.25:2181, initiating session
[INFO ][2017/08/09 19:53:22632][org.apache.zookeeper.ClientCnxn$SendThread.onConnected(ClientCnxn.java:1235)]

Session establishment complete on server HSlave3/192.168.100.25:2181, sessionid = 0x15dc6cda23f0004, negotiated timeout = 30000

# HSlave2已经重新开机并开启zkService,但没有运行程序建立节点, 服务器列表没有改变
[HSlave3, HSlave1]

# 将HSlave1关机,客户端更新服务器列表
[HSlave3]

# 将最后一台HSlave3也关机,客户端凌乱了(HSlave2维持开机并连接zkService)

[INFO ][2017/08/09 19:55:57207][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1098)]
Unable to read additional data from server sessionid 0x15dc6cda23f0004, likely server has closed socket, closing socket connection and attempting reconnect
[INFO ][2017/08/09 19:55:5850 ][org.apache.zookeeper.ClientCnxn$SendThread.logStartConnect(ClientCnxn.java:975)]
Opening socket connection to server HSlave2/192.168.100.24:2181. Will not attempt to authenticate using SASL (unknown error)
[INFO ][2017/08/09 19:55:5851 ][org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:852)]
Socket connection established to HSlave2/192.168.100.24:2181, initiating session
[INFO ][2017/08/09 19:55:5852 ][org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1098)]
Unable to read additional data from server sessionid 0x15dc6cda23f0004, likely server has closed socket, closing socket connection and attempting reconnect
org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /servers
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1472)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1500)
    at chuangzhi.DistributedClient.getServerList(DistributedClient.java:57)
    at chuangzhi.DistributedClient$1.process(DistributedClient.java:32)
    at org.apache.zookeeper.ClientCnxn$EventThread.processEvent(ClientCnxn.java:522)
    at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:498)

以下省略

用zookeeper体验监听服务器是否还活着相关推荐

  1. flume监听服务器文件,flume监听服务器端口数据库

    flume监听服务器端口数据库 内容精选 换一换 本章节为您介绍以下内容:准备弹性云服务器作为GDS服务器在使用GDS导入导出数据之前,需要准备一台或多台与GaussDB(DWS) 集群在相同VPC内 ...

  2. linux oracle开启监听服务器,linux服务器启动oracle监听端口

    oracle监听 原理 客户端向服务器端发送连接请求,监听器监听到客户端德连接请求 监听器监听到客户端德连接请求后,把客户端德连接请求交给数据库服务器处理 客户端和服务器端建立连接,连接建立后,服务器 ...

  3. 使用kazoo连接zookeeper并监听节点数量以及值变化

      目前kazoo是连接zk的最新第三方库,最新更新时间为2019年1月,其他第三方连接zk的库都长时间未更新,所以推荐使用kazoo.前面有几篇文章都已经详细给出了zk的部署,接下来是zk最核心的地 ...

  4. Apache ZooKeeper - 事件监听机制详解

    文章目录 事件监听机制命令 Zookeeper事件类型 实操 -w get -w /path 监听节点数据的变化 ls -w /path 监听子节点的变化(增,删) [监听目录] ls -w /pat ...

  5. Zookeeper Watch监听

    概述 ZooKeeper -server host:port cmd args stat path [watch]         ls path [watch]         ls2 path [ ...

  6. 【zookeeper】zookeeper 的监听机制

    文章目录 1.概述 2. shell案例 1.概述 视频:zookeeper znode 存储系统解密 上一篇文章:[zookeeper]zookeeper znode 存储系统解密 许多大数据组件都 ...

  7. 微信小程序监听服务器发送消息,微信小程序实时聊天WebSocket

    本文实例为大家分享了微信小程序实时聊天WebSocket的具体代码,供大家参考,具体内容如下 1.所有监听事件先在onload监听. // pages/index/to_news/to_news.js ...

  8. zookeeper 进行监听节点机制

    1) server端 在一个server启动时,如tomcat启动时,可以把在tomcat启动程序中,把当前tomcat服务写入到zookeeper 的 znode中(临时节点): 2) client ...

  9. 查看oracle监听服务器,处理Oracle 监听文件listener.log问题

    如果连接时候变得较慢 查看Oracle日志记录,可能是因为此文件太大,超过2G, 需要定期清理,(如果多用户,记得用root,可能没权限) 查看listener.log? find / -name l ...

最新文章

  1. 使用指针统计字符串中的数字字符的个数
  2. easymock快速入门
  3. linux下cd命令
  4. attribute java c_属性别名(Attribute Aliasing)
  5. net MVC 重定向总结
  6. java ee的小程序_扩展Java EE应用程序的基础
  7. LeetCode 1021. 删除最外层的括号(栈)
  8. liferay6连接mysql_Liferay 6开发学习(二十六):数据库连接相关问题
  9. 传奇HERO引擎给装备加套装属性技巧
  10. C# Web服务器控件FileUpload()上传文件
  11. Sublime Text 安装中文、英文字体
  12. python下载网页歌曲
  13. IPV6IPV4网址
  14. 股民误将向日葵当成农业股
  15. 用代码在最短时间做成事
  16. 【Java基础】二、大厂都开始重视的基础很重要吗?快来加入基础的学习,巩固一下细枝末角,刷刷面试题吧
  17. diy nas配置推荐2019_5款NAS 系统横向测评,看看哪款最适合你!
  18. Python文本分析案例:近体诗格律分析
  19. JavaFX鼠标移入后改变样式
  20. Python经典实验4-字典和集合的应用

热门文章

  1. 个人成长:谈谈工作之余如何提高个人技术水平
  2. 直接激光雷达里程计:基于稠密点云的快速定位
  3. sti()和cli()
  4. Python程序及交通态势数据
  5. Unity 设置程序在后台运行
  6. 云宏大讲坛 | Ceph分布式存储高性能设计
  7. Linux移动光标指令hkjl,使用 HPC Pack 在 Linux VM 上執行 OpenFOAM - Azure Virtual Machines | Microsoft Docs...
  8. 【科软课程-信息安全】Lab12 SQL Injection Attack
  9. IP地址为 140.111.0.0 的B类网络,若要切割为9个子网,而且都要 连上Internet,请问子网掩码设为
  10. html自动生成价格,Excel技巧:用VLOOKUP函数制作产品报价单,自动生成价格!