zookeeper watch java_Zookeeper:JavaAPI watcher机制

1.watcher架构

watcher由三个部分组成:

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

ab5b306e6152520496ab6388801f3d51.png

接口设计:

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.

*/

SaslAuthenticated(6),

/** 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

KeeperState(int intValue) {

this.intValue = intValue;

}

public int getIntValue() {

return intValue;

}

public static KeeperState fromInt(int intValue) {

switch(intValue) {

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

EventType(int intValue) {

this.intValue = intValue;

}

public int getIntValue() {

return intValue;

}

public static EventType fromInt(int intValue) {

switch(intValue) {

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");

}

}

}

da43189b2a1a96abcfea321bfd7596fc.png

以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 CountDownLatch(1);

static ZooKeeper zooKeeper;

public static void main(String[] args) throws Exception{

Watcher watcher;

zooKeeper = new ZooKeeper("192.168.10.132:2181", 5000, new ZKWatcher());

latch.await();

}

public void process(WatchedEvent event) {

if(event.getType() == Event.EventType.None){

if(event.getState() == Event.KeeperState.SyncConnected){

System.out.println("连接成功");

latch.countDown();

}else if(event.getState() == Event.KeeperState.Disconnected){

System.out.println("断开连接");

}else if(event.getState() == Event.KeeperState.Expired){

System.out.println("会话超时");

}else if(event.getState() == Event.KeeperState.AuthFailed){

System.out.println("认证失败");

}

}

}

}

3.检查节点是否存在

//使用链接对象的监视器

exists(String path,boolean b)

//自定义监视器

exists(String path,Watacher watcher)

//NodeCreated:节点创建

//NodeDeleted:节点删除

//NodeDataChanged:节点内容发生变化

4.查看节点

//使用连接对象的监视器

getData(String path,boolean b,Stat stat)

//自定义监视器

getData(String path,Watcher w,Stat stat)

//NodeDeleted:节点删除

//NodeDataChanged:节点内容变化

5.查看子节点

//使用连接对象的监视器

getChildren(String path,boolean b)

//自定义监视器

getChildren(String path,Watcher w)

//NodeDeleted:节点删除

//NodeChildrenChanged:子节点内容变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值