zoukankan      html  css  js  c++  java
  • Zookeeper Watcher接口

    在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。

    什么是Watcher

      同一个事件类型在不同的通知状态中代表的含义有所不同,表7-3列举了常见的通知状态和事件类型。

       Watcher通知状态与事件类型一览

        

      上图列举了ZooKeeper中最常见的几个通知状态和事件类型。
      回调方法process()
      process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理。process方法的定义如下:
    abstract public void process(WatchedEvent event);
        这个回调方法的定义非常简单,我们重点看下方法的参数定义:WatchedEvent。
        WatchedEvent包含了每一个事件的三个基本属性:通知状态(keeperState),事件类型(EventType)和节点路径(path),其数据结构如图7-5所示。ZooKeeper使用WatchedEvent对象来封装服务端事件并传递给Watcher,从而方便回调方法process对服务端事件进行处理。
        提到WatchedEvent,不得不讲下WatcherEvent实体。笼统地讲,两者表示的是同一个事物,都是对一个服务端事件的封装。不同的是,WatchedEvent是一个逻辑事件,用于服务端和客户端程序执行过程中所需的逻辑对象,而WatcherEvent因为实现了序列化接口,因此可以用于网络传输。
        服务端在生成WatchedEvent事件之后,会调用getWrapper方法将自己包装成一个可序列化的WatcherEvent事件,以便通过网络传输到客户端。客户端在接收到服务端的这个事件对象后,首先会将WatcherEvent还原成一个WatchedEvent事件,并传递给process方法处理,回调方法process根据入参就能够解析出完整的服务端事件了。
        需要注意的一点是,无论是WatchedEvent还是WatcherEvent,其对ZooKeeper服务端事件的封装都是机及其简单的。举个例子来说,当/zk-book这个节点的数据发生变更时,服务端会发送给客户端一个“ZNode数据内容变更”事件,客户端只能够接收到信息。

    Watcher案例

    复制代码
    package com.zook.util;
    
    import org.apache.zookeeper.*;
    import org.apache.zookeeper.data.Stat;
    
    import java.io.IOException;
    
    public class ZookeeperWatcher implements Watcher {
    
        //连接地址
        private static final String CONNECT_ADDDR="0.0.0.0:2181";
    
        //session超时时间
        private static final int SESSION_OUTTIMF=2000;
    
        //创建zk方法
        private ZooKeeper zk;
    
        private ZookeeperWatcher(){
            openConnection(CONNECT_ADDDR,SESSION_OUTTIMF);
        }
    
        @Override
        public void process(WatchedEvent watchedEvent) {
            //获取当前的状态
            Event.KeeperState keeperState=watchedEvent.getState();
            //获取通知类型
            Event.EventType eventType=watchedEvent.getType();
            //获取节点的路径
            String path = watchedEvent.getPath();
            System.out.println("当前的状态:"+keeperState+"	通知乐行:"+eventType+"节点路径:"+path);
            if (Event.KeeperState.SyncConnected==keeperState){
                if (Event.EventType.None==eventType){
                    System.out.println("=================连接事件回调==================");
                }
                if (Event.EventType.NodeCreated==eventType){
                    System.out.println("=================创建事件回调==================");
                }
                if (Event.EventType.NodeDataChanged==eventType){
                    System.out.println("=================修改事件回调==================");
                }
                if (Event.EventType.NodeDeleted==eventType){
                    System.out.println("=================删除事件回调==================");
                }
            }
        }
    
        /*连接zk方法*/
        public void openConnection(String zk_address,int zk_session){
            try {
                zk=new ZooKeeper(zk_address,zk_session,this);
                System.out.println("===============连接成功===============");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /*创建节点*/
        public void createNode(String path,String data){
            try {
                //监听器
                zk.exists(path,true);
                String s = zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
                System.out.println("================创建成功===================");
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        /*修改节点*/
        public void setNode(String path,String data){
            try {
                //监听器
                zk.exists(path,true);
                Stat stat = zk.setData(path, data.getBytes(), -1);
                System.out.println("===================修改成功======================");
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        /*删除节点*/
        public void delNode(String path){
            try {
                //监听器
                zk.exists(path,true);
                zk.delete(path,-1);
                System.out.println("=====================删除成功过====================");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (KeeperException e) {
                e.printStackTrace();
            }
        }
    
        /*关闭连接*/
        public void closeConnection(){
            try {
                zk.close();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args){
            ZookeeperWatcher zook=new ZookeeperWatcher();
            //创建节点
            //zook.createNode("/zk01","zkValue");
            //修改节点
            //zook.setNode("/zk01","zkValueSet");
            //删除节点
            zook.delNode("/zk01");
            zook.closeConnection();
        }
    
    
    }
  • 相关阅读:
    Mysql.linux登录数据库
    Linux.vim编辑器显示行号
    经济学-泰勒
    MyBatis.多条件排序
    Mysql.复选条件的查询
    前端.省市级联框
    前端.解决form-contral总是换行问题
    若依框架. 仿ThymeLeaf前端SelectDictLable方法
    excel中为什么不显示单引号
    python-爬虫(3)---lxml匹配css
  • 原文地址:https://www.cnblogs.com/qinzhenyu/p/11935007.html
Copyright © 2011-2022 走看看