监听器
监听重要数据或者对象的变化(添加,删除,修改)
》1:定义监听器
public interface MyListener {
public void process();
}
》2:在类中调用监听器
//1:当前price是私有的,可以使用set方法
//2:定义一个监听器,监听price,如果价格发生变化则执行监听器的方法
//2.1定义了一个接口,接口内有一个process
public class MyData {
private String pname;
private double price;
//2.2在类中定义一个成员变量,类型就是监听器
private MyListener myListener;
public void setOnPriceListener(MyListener myListener) {
this.myListener = myListener;
}
//2.3 必须修改数据的位置调用监听器的方法
public void setPrice(double price) {
this.price = price;
if(myListener!=null){
myListener.process();
}
}
@Override
public String toString() {
return "MyData{" +
"pname='" + pname + '\'' +
", price=" + price +
'}';
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public double getPrice() {
return price;
}
}
》3:使用监听器
设置监听器
修改被监听的数据
public class TestListener {
@Test
public void test01 (){
MyData myData = new MyData();
System.out.println(myData);
myData.setPname("特斯拉");
//设置监听器
myData.setOnPriceListener(new MyListener() {
public void process() {
System.out.println("有人修改价格数据了!!!");
System.out.println("发短信用给用户:特斯拉割久菜");
}
});
//有监听器设置给对象内部,有修改到监听的数据
myData.setPrice(20000.00);
System.out.println(myData);
}
}
监听原理详解:
1)首先要有一个main()线程
2)在main线程中创建Zookeeper客户端,这时就会创建两个线程,一个负责网络连接通信(connet),一个负责监听(listener)。
3)通过connect线程将注册的监听事件发送给Zookeeper。
4)在Zookeeper的注册监听器列表中将注册的监听事件添加到列表中。
5)Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
6)listener线程内部调用了process()方法。
常见的监听
(1)监听节点数据的变化:
get path [watch]
(2)监听子节点增减的变化
ls path [watch]
Stat结构体
1)czxid-创建节点的事务zxid
每次修改ZooKeeper状态都会收到一个zxid形式的时间戳,也就是ZooKeeper事务ID。
事务ID是ZooKeeper中所有修改总的次序。每个修改都有唯一的zxid,如果zxid1小于zxid2,那么zxid1在zxid2之前发生。
2)ctime - znode被创建的毫秒数(从1970年开始)
3)mzxid - znode最后更新的事务zxid
4)mtime - znode最后修改的毫秒数(从1970年开始)
5)pZxid-znode最后更新的子节点zxid
6)cversion - znode子节点变化号,znode子节点修改次数
7)dataversion - znode数据变化号
8)aclVersion - znode访问控制列表的变化号
9)ephemeralOwner- 如果是临时节点,这个是znode拥有者的session id。如果不是临时节点则是0。
10)dataLength- znode的数据长度
11)numChildren - znode子节点数量
zk写数据流程
1)Client 向 ZooKeeper 的 Server1 上写数据,发送一个写请求。
2)如果Server1不是Leader,那么Server1 会把接受到的请求进一步转发给Leader,因为每个ZooKeeper的Server里面有一个是Leader。这个Leader 会将写请求广播给各个Server,比如Server1和Server2,各个Server写成功后就会通知Leader。
3)当Leader收到大多数 Server 数据写成功了,那么就说明数据写成功了。如果这里三个节点的话,只要有两个节点数据写成功了,那么就认为数据写成功了。写成功之后,Leader会告诉Server1数据写成功了。
4)Server1会进一步通知 Client 数据写成功了,这时就认为整个写操作成功。ZooKeeper 整个写数据流程就是这样的。
企业面试题
1 请简述ZooKeeper的选举机制
2 ZooKeeper的监听原理是什么?
3 ZooKeeper的部署方式有哪几种?集群中的角色有哪些?集群最少需要几台机器?
(1)部署方式单机模式、集群模式
(2)角色:Leader和Follower
(3)集群最少需要机器数:3
4 ZooKeeper的常用命令
ls create get delete set…