zookeeper编程01-循环监听

zookeeper可以对某个节点进行监听,监听的事件有以下4种:

  • NodeCreated (节点创建)
  • NodeDeleted (节点删除)
  • NodeDataChanged (节点数据变化)
  • NodeChildrenChanged (子节点变化,包括子节点删除、创建和数据变化) 但每个事件只能触发一次,之后监听就不再生效 本文介绍怎么实现zookeeper对节点的循环监听,即永久生效

1. 流程

客户端发起对节点的事务操作(以NodeChildrenChanged事件为例) 服务端监听到对应的事件后进行相应的操作

2. 代码实现

(1) Client.java

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class Client {

    private static final String CONNECT_STRING = "hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181";
    private static final int SESSION_TIMEOUT = 5000;
    private static final String PARENT = "/name";
    private static final String CHILD = "tony";
    
    public static void main(String[] args) throws Exception {
        
        ZooKeeper zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, null);
        
        // 客户端创建了一个子节点,会触发NodeChildrenChanged事件
        String path = zk.create(PARENT + "/" + CHILD, CHILD.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println(path);
        zk.close();
    }
    
}

(2) Server.java

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;

/**
 * @Description: 循环监听某节点
 * @author Jed
 * @date 2017年12月19日
 */
public class Server {

    private static ZooKeeper zk;
    private static final String CONNECT_STRING = "hadoop01:2181,hadoop02:2181,hadoop03:2181,hadoop04:2181";
    private static final int SESSION_TIMEOUT = 5000;
    private static final String PARENT = "/name";
    
    public static void main(String[] args) throws Exception {
        zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, new Watcher() {
            
            @Override
            public void process(WatchedEvent event) {
                String path = event.getPath();
                EventType type = event.getType();
                KeeperState state = event.getState();
                System.out.println(path + "\t" + type + "\t" + state);
                
                // 循环监听
                try {
                    zk.getChildren(PARENT, true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        
        // 添加监听
        zk.getChildren(PARENT, true);
        
        // 模拟服务器一直运行
        Thread.sleep(Long.MAX_VALUE);
    }
}

3. 测试

  1. 首先运行server.java

控制台输出:

null    None    SyncConnected

这是获取连接时的事件,每次获得连接都会触发

  1. 然后运行一次Client.java

Client控制台输出:

/name/tony0000000000

因为Client创建的是PERSISTENT_SEQUENTIAL类型的节点,所以会自动递增的编号 Server控制台的内容实时更新:

null    None    SyncConnected
/name   NodeChildrenChanged SyncConnected
  1. 再运行一次Client.java

Client控制台输出:

/name/tony0000000001

Server控制台的内容也会实时更新:

null    None    SyncConnected
/name   NodeChildrenChanged SyncConnected
/name   NodeChildrenChanged SyncConnected

至此,我们已经实现了对某个节点的循环监听!

说明:

  1. 监听到对应的事件触发后,我们只是做了打印,具体的行为应该根据业务逻辑来设计
  2. 监听某个节点的子节点变化(NodeChildrenChangeds)事件,首先该节点应该存在,本例中监听/name节点的子节点变化,那么/name节点应该提前创建好

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏NetCore

Linq to Sql 更新数据时容易忽略的问题

越来越多的朋友喜欢用Linq to Sql来进行开发项目了,一般我们都会遇到CRUD等操作,不可否认,在查询方面Linq真的带来很大的便利,性能方面也表现不错,...

20880
来自专栏walterlv - 吕毅的博客

使用 Task.Wait()?立刻死锁(deadlock)

发布于 2017-10-27 15:54 更新于 2018-04...

11310
来自专栏java相关

Mac OS使用brew安装memcached

12110
来自专栏一个爱瞎折腾的程序猿

在asp.net core2.1中添加中间件以扩展Swashbuckle.AspNetCore3.0支持简单的文档访问权限控制

在此之前的接口项目中,若使用了 Swashbuckle.AspNetCore,都是控制其只在开发环境使用,不会就这样将其发布到生产环境(安全第一) 。 那么,...

17710
来自专栏智能大石头

NewLife.Redis基础教程

X组件缓存架构以ICache接口为核心,包括MemoryCache、Redis和DbCache实现,支持FX和netstandard2.0! 后续例程与使用说明...

12430
来自专栏行者悟空

利用zookeeper实现服务上线(离线)自动感知

32520
来自专栏黑泽君的专栏

SolrCloud搭建 + zookeeper集群搭建 + 搜索功能切换到集群版 + httpclient学习 + 全局异常处理器

索引集合包括两个Shard(Shard1和Shard2),Shard1和Shard2分别由三个Core组成,其中一个Leader两个Replication,L...

20820
来自专栏极乐技术社区

小程序支付详解+源码(客户端+服务端)

小程序的支付调通,和大家分享下(坑) 包括小程序端、java服务器端 和其他方式的微信支付方式区别不大,也都需要经过统一下单、支付结果通知(回调),具体流程如...

24950
来自专栏木宛城主

基于Socket的网络聊天室编程(第一版)

一:什么是套接字 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型。在这种方案中客户应用程序向服务器程序请求服务。一个服务程序通常...

30150
来自专栏EAWorld

使用Lambda和API网关在Java中开发RESTful微服务

原题:Developing RESTful APIs in Java using Amazon APIGateway and AWS Lambda

28820

扫码关注云+社区

领取腾讯云代金券