【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

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

grom设置全局日志实现执行并打印sql语句

《grom设置全局日志实现执行并打印sql语句》本文主要介绍了grom设置全局日志实现执行并打印sql语句,包括设置日志级别、实现自定义Logger接口以及如何使用GORM的默认logger,通过这些... 目录gorm中的自定义日志gorm中日志的其他操作日志级别Debug自定义 Loggergorm中的

Apache伪静态(Rewrite).htaccess文件详解与配置技巧

《Apache伪静态(Rewrite).htaccess文件详解与配置技巧》Apache伪静态(Rewrite).htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令,主要的... 一、.htAccess的基本作用.htaccess是一个纯文本文件,它里面存放着Apache服务器

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...