【Apache ZooKeeper】为ZNode设置watcher

2023-10-15 04:08

本文主要是介绍【Apache ZooKeeper】为ZNode设置watcher,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       众所周知,ZooKeeper中的ZNode是树形结构,现在我需要给/app1结点设置watcher,监听/app1下增减、删除和修改的结点,并将相应的事件使用log4j记录到日志文件中。ZNode的变化可以直接通过event.getType来获取。使用zk.exists(PATH, wc);来为PATH结点设置watcher,所有结点都可以使用wc做watcher。 

       代码如下:

package com.iflytek.cpcloud.zookeeper;import java.io.IOException;
import java.util.List;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.PropertyConfigurator;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;public class WatchClient implements Runnable {private static final Log LOG = LogFactory.getLog(WatchClient.class);public static final int CLIENT_PORT = 2181;public static final String PATH = "/app1";// 所要监控的结点private static ZooKeeper zk;private static List<String> nodeList;// 所要监控的结点的子结点列表public static void main(String[] args) throws Exception {PropertyConfigurator.configure("F:\\test\\conf\\log4j.properties");WatchClient client = new WatchClient();Thread th = new Thread(client);th.start();}public WatchClient() throws IOException {zk = new ZooKeeper("192.168.255.133:" + CLIENT_PORT, 21810,new Watcher() {public void process(WatchedEvent event) {}});}/*** 设置watch的线程*/@Overridepublic void run() {Watcher wc = new Watcher() {@Overridepublic void process(WatchedEvent event) {// 结点数据改变之前的结点列表List<String> nodeListBefore = nodeList;// 主结点的数据发生改变时if (event.getType() == EventType.NodeDataChanged) {LOG.info("Node data changed:" + event.getPath());}if (event.getType() == EventType.NodeDeleted){LOG.info("Node deleted:" + event.getPath());}if(event.getType()== EventType.NodeCreated){LOG.info("Node created:"+event.getPath());}// 获取更新后的nodelisttry {nodeList = zk.getChildren(event.getPath(), false);} catch (KeeperException e) {System.out.println(event.getPath()+" has no child, deleted.");} catch (InterruptedException e) {e.printStackTrace();}List<String> nodeListNow = nodeList;// 增加结点if (nodeListBefore.size() < nodeListNow.size()) {for (String str : nodeListNow) {if (!nodeListBefore.contains(str)) {LOG.info("Node created:" + event.getPath() + "/" + str);}}}}};/*** 持续监控PATH下的结点*/while (true) {try {zk.exists(PATH, wc);//所要监控的主结点} catch (KeeperException | InterruptedException e) {e.printStackTrace();}try {nodeList = zk.getChildren(PATH, wc);} catch (KeeperException | InterruptedException e) {e.printStackTrace();}// 对PATH下的每个结点都设置一个watcherfor (String nodeName : nodeList) {try {zk.exists(PATH + "/" + nodeName, wc);} catch (KeeperException | InterruptedException e) {e.printStackTrace();}}try {Thread.sleep(3000);// sleep一会,减少CUP占用率} catch (InterruptedException e) {e.printStackTrace();}}}
}

该项目使用maven构建。pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.iflytek.cpcloud</groupId><artifactId>zookeeper-test</artifactId><version>0.1.0-SNAPSHOT</version><dependencies><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>commons-cli</groupId><artifactId>commons-cli</artifactId><version>1.2</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.5</version></dependency></dependencies><build><plugins><plugin><artifactId>maven-assembly-plugin</artifactId><version>2.2-beta-5</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.2</version><configuration><source>1.6</source><target>1.6</target><encoding>UTF-8</encoding></configuration></plugin></plugins></build></project>


这篇关于【Apache ZooKeeper】为ZNode设置watcher的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/215237

相关文章

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

PostgreSQL 默认隔离级别的设置

《PostgreSQL默认隔离级别的设置》PostgreSQL的默认事务隔离级别是读已提交,这是其事务处理系统的基础行为模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一 默认隔离级别概述1.1 默认设置1.2 各版本一致性二 读已提交的特性2.1 行为特征2.2

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot

安装centos8设置基础软件仓库时出错的解决方案

《安装centos8设置基础软件仓库时出错的解决方案》:本文主要介绍安装centos8设置基础软件仓库时出错的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录安装Centos8设置基础软件仓库时出错版本 8版本 8.2.200android4版本 javas