zookeeper的java客户端api的监听功能
Zookeeper的java客户端api的监听功能
1.其中master slave1 slave2需要修改本地hosts文件 C:WindowsSystem32driversetchosts
192.168.1.10 master 192.168.1.11 slave1 192.168.1.12 slave2
检查是否能在本机ping通 2.监听节点的主类需要Thread.sleep(Long.MAX_VALUE); 在构造zookeeper客户端对象时,zookeeper创建了两个线程sendThread,eventThread。
public void start() { sendThread.start(); eventThread.start(); }
其中sendThread用来接发数据,eventThread用来监听。而eventThread线程中setDaemon则是一个守护进程。Daemon() 程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端,不与前台交互,Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。一旦main线程结束,守护线程就结束。因此使得线程一直监听节点状态,需要使得main线程sleep。
EventThread() { super(makeThreadName("-EventThread")); setUncaughtExceptionHandler(uncaughtExceptionHandler); setDaemon(true); }
3.实现
public class ZookeeperWatchDemo { ZooKeeper zk = null; @Before public void init() throws IOException { zk = new ZooKeeper("master:2181,slave1:2181,slave2:2181", 2000, new Watcher() { //内部类可读性很差,可以写成外部类 @Override public void process(WatchedEvent event) { if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeDataChanged) { System.out.println(event.getPath()); System.out.println(event.getType()); System.out.println("The NodeData has changed!"); try { zk.getData("/myboys", true, null); } catch (InterruptedException | KeeperException e) { e.printStackTrace(); } }else if(event.getState() == KeeperState.SyncConnected && event.getType() == EventType.NodeChildrenChanged) { System.out.println("子节点发生变化"); }else { System.out.println("zookeeper连接成功!"); } } }); } @Test public void testGetWatch() throws KeeperException, InterruptedException, UnsupportedEncodingException { byte[] data = zk.getData("/myboys", true, null); //监听节点数据变化 List<String> children = zk.getChildren("/myboys", true);//监听节点的子节点变化事件 System.out.println(new String(data,"utf-8")); //时间监听线程是一个setDaemon守护线程,如果主线程退出,那么守护线程也会退出,不再监听,因此要让线程sleep Thread.sleep(Long.MAX_VALUE); } }
上一篇:
多线程四大经典案例
下一篇:
Discuz如何开发关注功能