Zookeeper:JavaAPI watcher机制

1.watcher架构

watcher由三个部分组成:

zookeeper服务端、zookeeper客户端、客户端的ZKWatchManager对象。

接口设计:

Watcher接口中含有一个内部接口Event,其中含有两个枚举KeeperStat通知状态)和EventType事件类型)

public enum KeeperState {
            /** Unused, this state is never generated by the server */
            @Deprecated
            Unknown -1),

            /** The client is in the disconnected state - it is not connected
             * to any server in the ensemble. */
            Disconnected 0),

            /** Unused, this state is never generated by the server */
            @Deprecated
            NoSyncConnected 1),

            /** The client is in the connected state - it is connected
             * to a server in the ensemble one of the servers specified
             * in the host connection parameter during ZooKeeper client
             * creation). */
            SyncConnected 3),

            /**
             * Auth failed state
             */
            AuthFailed 4),

            /**
             * The client is connected to a read-only server, that is the
             * server which is not currently connected to the majority.
             * The only operations allowed after receiving this state is
             * read operations.
             * This state is generated for read-only clients only since
             * read/write clients aren't allowed to connect to r/o servers.
             */
            ConnectedReadOnly 5),

            /**
              * SaslAuthenticated: used to notify clients that they are SASL-authenticated,
              * so that they can perform Zookeeper actions with their SASL-authorized permissions.
              */
            SaslAuthenticated6),

            /** The serving cluster has expired this session. The ZooKeeper
             * client connection the session) is no longer valid. You must
             * create a new client connection instantiate a new ZooKeeper
             * instance) if you with to access the ensemble. */
            Expired -112);

            private final int intValue;     // Integer representation of value
                                            // for sending over wire

            KeeperStateint intValue) {
                this.intValue = intValue;
            }

            public int getIntValue) {
                return intValue;
            }

            public static KeeperState fromIntint intValue) {
                switchintValue) {
                    case   -1: return KeeperState.Unknown;
                    case    0: return KeeperState.Disconnected;
                    case    1: return KeeperState.NoSyncConnected;
                    case    3: return KeeperState.SyncConnected;
                    case    4: return KeeperState.AuthFailed;
                    case    5: return KeeperState.ConnectedReadOnly;
                    case    6: return KeeperState.SaslAuthenticated;
                    case -112: return KeeperState.Expired;

                    default:
                        throw new RuntimeException"Invalid integer value for conversion to KeeperState");
                }
            }
        }
public enum EventType {
            None -1),
            NodeCreated 1),
            NodeDeleted 2),
            NodeDataChanged 3),
            NodeChildrenChanged 4);

            private final int intValue;     // Integer representation of value
                                            // for sending over wire

            EventTypeint intValue) {
                this.intValue = intValue;
            }

            public int getIntValue) {
                return intValue;
            }

            public static EventType fromIntint intValue) {
                switchintValue) {
                    case -1: return EventType.None;
                    case  1: return EventType.NodeCreated;
                    case  2: return EventType.NodeDeleted;
                    case  3: return EventType.NodeDataChanged;
                    case  4: return EventType.NodeChildrenChanged;

                    default:
                        throw new RuntimeException"Invalid integer value for conversion to EventType");
                }
            }           
        }

  

 

 以node节点为例,说明调用的注册方法和可监听时间间的关系:

注册方式 Created ChildrenChanged Changed Deleted
zk.exists”/node”,watcher) 可监控   可监控 可监控
zk.getData”/node”,watcher)     可监控 可监控
zk.getChildren”/node”,watcher)   可监控   可监控

 2.注册Watcher

KeeperState 通知状态

public class ZKWatcher implements Watcher{

    static CountDownLatch latch = new CountDownLatch1);

    static ZooKeeper zooKeeper;

    public static void mainString[] args) throws Exception{
        Watcher watcher;
        zooKeeper = new ZooKeeper"192.168.10.132:2181", 5000, new ZKWatcher));
        latch.await);
    }

    public void processWatchedEvent event) {
        ifevent.getType) == Event.EventType.None){
            ifevent.getState) == Event.KeeperState.SyncConnected){
                System.out.println"连接成功");
                latch.countDown);
            }else ifevent.getState) == Event.KeeperState.Disconnected){
                System.out.println"断开连接");
            }else ifevent.getState) == Event.KeeperState.Expired){
                System.out.println"会话超时");
            }else ifevent.getState) == Event.KeeperState.AuthFailed){
                System.out.println"认证失败");
            }
        }

    }
}

3.检查节点是否存在

//使用链接对象的监视器
existsString path,boolean b)
//自定义监视器
existsString path,Watacher watcher)
//NodeCreated:节点创建
//NodeDeleted:节点删除
//NodeDataChanged:节点内容发生变化

4.查看节点

//使用连接对象的监视器
getDataString path,boolean b,Stat stat)
//自定义监视器
getDataString path,Watcher w,Stat stat)

//NodeDeleted:节点删除
//NodeDataChanged:节点内容变化

5.查看子节点 

//使用连接对象的监视器
getChildrenString path,boolean b)
//自定义监视器
getChildrenString path,Watcher w)

//NodeDeleted:节点删除
//NodeChildrenChanged:子节点内容变化

  

Published by

风君子

独自遨游何稽首 揭天掀地慰生平