掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括:
1,配置文件同步
2,主从切换
3,分布式队列
4,分布式锁
5,其他
本篇我们就来看下,如何使用curator来完成监听,代码如下:
1 package com.qin.curator.zk; 2 3 import javax.sound.midi.Patch; 4 5 import org.apache.curator.RetryPolicy; 6 import org.apache.curator.framework.CuratorFramework; 7 import org.apache.curator.framework.CuratorFrameworkFactory; 8 import org.apache.curator.framework.CuratorFrameworkFactory.Builder; 9 import org.apache.curator.framework.api.CuratorWatcher; 10 import org.apache.curator.framework.recipes.cache.NodeCache; 11 import org.apache.curator.framework.recipes.cache.NodeCacheListener; 12 import org.apache.curator.framework.recipes.cache.PathChildrenCache; 13 import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent; 14 import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener; 15 import org.apache.curator.retry.ExponentialBackoffRetry; 16 import org.apache.curator.utils.ZKPaths; 17 import org.apache.zookeeper.WatchedEvent; 18 /** 19 * 20 * 使用curator监听zookeeper节点 21 * @author qindongliang 22 * **/ 23 public class CuratorWatch { 24 25 static CuratorFramework zkclient=null; 26 static String nameSpace="php"; 27 static { 28 29 String zkhost="192.168.46.22:2181";//zk的host 30 RetryPolicy rp=new ExponentialBackoffRetry(1000, 3);//重试机制 31 Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost) 32 .connectionTimeoutMs(5000) 33 .sessionTimeoutMs(5000) 34 .retryPolicy(rp); 35 builder.namespace(nameSpace); 36 CuratorFramework zclient = builder.build(); 37 zkclient=zclient; 38 zkclient.start();// 放在这前面执行 39 zkclient.newNamespaceAwareEnsurePath(nameSpace); 40 41 } 42 43 44 public static void main(String[] args) throws Exception{ 45 46 47 watch(); 48 Thread.sleep(Long.MAX_VALUE); 49 50 } 51 52 53 /** 54 * 55 * 监听节点变化 56 * 57 * */ 58 public static void watch()throws Exception{ 59 PathChildrenCache cache = new PathChildrenCache(zkclient, "/zk", false); 60 cache.start(); 61 62 System.out.println("监听开始/zk........"); 63 PathChildrenCacheListener plis=new PathChildrenCacheListener() { 64 65 @Override 66 public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) 67 throws Exception { 68 switch ( event.getType() ) 69 { 70 case CHILD_ADDED: 71 { 72 System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 73 break; 74 } 75 76 77 case CHILD_UPDATED: 78 { 79 System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 80 break; 81 } 82 83 case CHILD_REMOVED: 84 { 85 System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath())); 86 break; 87 } 88 } 89 90 91 } 92 }; 93 //注册监听 94 cache.getListenable().addListener(plis); 95 96 } 97 98 99 100 101 }
运行后的控制台打印:
1 18:33:07.722 [main] INFO o.a.c.f.imps.CuratorFrameworkImpl - Starting 2 18:33:07.727 [main] DEBUG o.a.curator.CuratorZookeeperClient - Starting 3 18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - Starting 4 18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - reset 5 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT 6 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=QINDONGLIANG.dhgatecn.msf 7 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.7.0_04 8 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation 9 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:Javajdk1.7.0_04jre 10 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=D:eclipseworkspace2ywopzkin;D:eclipseworkspace2ywopzklibcurator-client-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-examples-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-framework-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-recipes-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-test-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-discovery-server-2.6.0.jar;D:eclipseworkspace2ywopzklibcurator-x-rpc-2.6.0.jar;D:eclipseworkspace2ywopzkliblog4j-1.2.15.jar;D:eclipseworkspace2ywopzklibzookeeper-3.4.5.jar;D:eclipseworkspace2ywopzklibcommons-io-2.1.jar 11 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=D:Javajdk1.7.0_04in;C:WindowsSunJavain;C:Windowssystem32;C:Windows;D:/Java/jdk1.7.0_04/bin/../jre/bin/server;D:/Java/jdk1.7.0_04/bin/../jre/bin;D:/Java/jdk1.7.0_04/bin/../jre/lib/amd64;C:Program FilesCommon FilesMicrosoft SharedWindows Live;C:Program Files (x86)Common FilesMicrosoft SharedWindows Live;D:Javajdk1.7.0_04in;D:Javajdk1.7.0_04jrein;D:apache-ant-1.9.3in;C:Windowssystem32;C:Windows;C:WindowsSystem32Wbem;C:WindowsSystem32WindowsPowerShellv1.0;C:Program Files (x86)LenovoLenovo Home;C:Program Files (x86)Windows LiveShared;C:Program FilesTortoiseSVNin;D:hadoop-2.2.0/bin;C:MyProgramFilesapache-maven-3.0.5in;D:python;E:eclipse;;. 12 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:UsersQINDON~1AppDataLocalTemp 13 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA> 14 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 7 15 18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64 16 18:33:07.735 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=6.1 17 18:33:07.735 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=qindongliang 18 18:33:07.735 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:Usersqindongliang 19 18:33:07.735 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=D:eclipseworkspace2ywopzk 20 18:33:07.735 [main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=192.168.46.22:2181 sessionTimeout=5000 watcher=org.apache.curator.ConnectionState@2c351b05 21 18:33:07.738 [main] DEBUG org.apache.zookeeper.ClientCnxn - zookeeper.disableAutoWatchReset is false 22 18:33:07.760 [main-SendThread(192.168.46.22:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server 192.168.46.22/192.168.46.22:2181. Will not attempt to authenticate using SASL (unknown error) 23 18:33:07.761 [main-SendThread(192.168.46.22:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established to 192.168.46.22/192.168.46.22:2181, initiating session 24 18:33:07.762 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on 192.168.46.22/192.168.46.22:2181 25 18:33:07.766 [main-SendThread(192.168.46.22:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server 192.168.46.22/192.168.46.22:2181, sessionid = 0x148ac15236f0046, negotiated timeout = 5000 26 18:33:07.771 [main-EventThread] INFO o.a.c.f.state.ConnectionStateManager - State change: CONNECTED 27 18:33:08.784 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:null serverPath:null finished:false header:: 1,3 replyHeader:: 1,233,0 request:: '/php,F response:: s{117,117,1411712541330,1411712541330,0,5,0,0,0,3,204} 28 18:33:08.784 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x148ac15236f0046 after 4ms 29 监听开始/zk........ 30 18:33:08.795 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:null serverPath:null finished:false header:: 2,3 replyHeader:: 2,233,0 request:: '/php,F response:: s{117,117,1411712541330,1411712541330,0,5,0,0,0,3,204} 31 18:33:08.797 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:null serverPath:null finished:false header:: 3,3 replyHeader:: 3,233,0 request:: '/php/zk,F response:: s{151,182,1411714954448,1411716422668,2,5,0,0,9,3,228} 32 18:33:08.804 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:/php/zk serverPath:/php/zk finished:false header:: 4,12 replyHeader:: 4,233,0 request:: '/php/zk,T response:: v{'bb,'cc,'cc334},s{151,182,1411714954448,1411716422668,2,5,0,0,9,3,228} 33 18:33:08.815 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:/php/zk/bb serverPath:/php/zk/bb finished:false header:: 5,4 replyHeader:: 5,233,0 request:: '/php/zk/bb,T response:: #6920616d2061207a6b20636f6e74656e742031,s{152,156,1411714954452,1411714982893,2,0,0,0,19,0,152} 34 18:33:08.816 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:/php/zk/cc serverPath:/php/zk/cc finished:false header:: 6,4 replyHeader:: 6,233,0 request:: '/php/zk/cc,T response:: #63313163,s{185,222,1411716737805,1411725726750,3,0,0,0,4,0,185} 35 18:33:08.817 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x148ac15236f0046, packet:: clientPath:/php/zk/cc334 serverPath:/php/zk/cc334 finished:false header:: 7,4 replyHeader:: 7,233,0 request:: '/php/zk/cc334,T response:: #636363,s{189,226,1411716744253,1411725775109,2,3,0,0,3,3,220} 36 Node added: bb 37 Node added: cc 38 Node added: cc334 39 18:33:10.482 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x148ac15236f0046 after 1ms 40 18:33:12.148 [main-SendThread(192.168.46.22:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Got ping response for sessionid: 0x148ac15236f0046 after 1ms