zookeeper源码分析-事件监听Watcher
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper源码分析-事件监听Watcher相关的知识,希望对你有一定的参考价值。
Watcher是zookeeper的事件监听机制,今天我们来看看Watcher类的代码都包含了什么内容?
Watcher
Watcher是一个接口,定义了process方法,需要子类实现。其代表了实现Watcher接口时必须实现的的方法,即定义进行处理,WatchedEvent表示观察的事件。
abstract public void process(WatchedEvent event);
内部类
1、Event接口
表示事件代表的状态,其包含了KeeperState和EventType两个内部枚举类。
KeeperState
KeeperState是一个枚举类,其定义了在事件发生时Zookeeper所处的各种状态,其还定义了一个从整型值返回对应状态的方法fromInt。
@InterfaceAudience.Public
public interface Event {
/**
* Enumeration of states the ZooKeeper may be at the event
*/
@InterfaceAudience.Public
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.
*/
//SASL认证通过状态
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),
/**
* The client has been closed. This state is never generated by
* the server, but is generated locally when a client calls
* {@link ZooKeeper#close()} or {@link ZooKeeper#close(int)}
*/
//关闭
Closed (7);
//代表状态的整型值
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;
case 7: return KeeperState.Closed;
default:
throw new RuntimeException("Invalid integer value for conversion to KeeperState");
}
}
}
EventType
EventType是一个枚举类,其定义了事件的类型(如创建节点、删除节点等事件),同时,其还定义了一个从整型值返回对应事件类型的方法fromInt。
@InterfaceAudience.Public
public enum EventType {
//无
None (-1),
//结点创建
NodeCreated (1),
//结点删除
NodeDeleted (2),
//结点数据变化
NodeDataChanged (3),
//子结点变化
NodeChildrenChanged (4),
//监听移除
DataWatchRemoved (5),
//子结点监听移除
ChildWatchRemoved (6);
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;
case 5: return EventType.DataWatchRemoved;
case 6: return EventType.ChildWatchRemoved;
default:
throw new RuntimeException("Invalid integer value for conversion to EventType");
}
}
}
2、枚举类WatcherType
监听器类型枚举
@InterfaceAudience.Public
public enum WatcherType {
//子监听器
Children(1),
//数据监听
Data(2),
//任意
Any(3);
// Integer representation of value
private final int intValue;
private WatcherType(int intValue) {
this.intValue = intValue;
}
public int getIntValue() {
return intValue;
}
//整数到类型的转换
public static WatcherType fromInt(int intValue) {
switch (intValue) {
case 1:
return WatcherType.Children;
case 2:
return WatcherType.Data;
case 3:
return WatcherType.Any;
default:
throw new RuntimeException(
"Invalid integer value for conversion to WatcherType");
}
}
}
WatchedEvent
/**
* Create a WatchedEvent with specified type, state and path
*/
public WatchedEvent(EventType eventType, KeeperState keeperState, String path) {
this.keeperState = keeperState;
this.eventType = eventType;
this.path = path;
}
WatchedEvent类包含了三个属性,分别代表事件发生时Zookeeper的状态、事件类型和发生事件所涉及的节点路径。
以上是关于zookeeper源码分析-事件监听Watcher的主要内容,如果未能解决你的问题,请参考以下文章