您的位置:首页 > 教育 > 培训 > 网站维护的主要内容包括_温州网站推广哪家好_培训seo去哪家机构最好_百度投放广告收费标准

网站维护的主要内容包括_温州网站推广哪家好_培训seo去哪家机构最好_百度投放广告收费标准

2025/2/27 12:06:38 来源:https://blog.csdn.net/qq_63553317/article/details/145818746  浏览:    关键词:网站维护的主要内容包括_温州网站推广哪家好_培训seo去哪家机构最好_百度投放广告收费标准
网站维护的主要内容包括_温州网站推广哪家好_培训seo去哪家机构最好_百度投放广告收费标准

我来为你展示如何在Java项目中通过ZooKeeper获取已注册的内容。下面提供一个完整的示例,包括连接ZooKeeper、获取节点数据以及处理常见情况的代码。


示例代码

以下代码演示了如何从ZooKeeper中获取注册内容:

import org.apache.zookeeper.*;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch;public class ZookeeperGetContentExample {private static final String ZK_CONNECT_STRING = "localhost:2181"; // ZooKeeper地址private static final int SESSION_TIMEOUT = 5000; // 会话超时时间(ms)private static ZooKeeper zooKeeper;private static final CountDownLatch connectedSignal = new CountDownLatch(1);public static void main(String[] args) {try {// 建立连接connectToZookeeper();// 示例路径String path = "/my-service";// 获取单个节点内容getNodeContent(path);// 获取子节点列表getChildren(path);// 关闭连接zooKeeper.close();} catch (Exception e) {e.printStackTrace();}}// 连接ZooKeeperprivate static void connectToZookeeper() throws IOException {zooKeeper = new ZooKeeper(ZK_CONNECT_STRING, SESSION_TIMEOUT, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (event.getState() == Event.KeeperState.SyncConnected) {connectedSignal.countDown();System.out.println("成功连接到ZooKeeper");}}});try {connectedSignal.await(); // 等待连接成功} catch (InterruptedException e) {e.printStackTrace();}}// 获取节点内容private static void getNodeContent(String path) throws KeeperException, InterruptedException {if (zooKeeper.exists(path, false) != null) {// 获取节点数据byte[] data = zooKeeper.getData(path, false, null);String content = data != null ? new String(data) : "无数据";System.out.println("路径 " + path + " 的内容: " + content);// 获取节点Stat信息(可选)Stat stat = new Stat();zooKeeper.getData(path, false, stat);System.out.println("节点版本: " + stat.getVersion());System.out.println("创建时间: " + stat.getCtime());} else {System.out.println("路径 " + path + " 不存在");}}// 获取子节点列表private static void getChildren(String path) throws KeeperException, InterruptedException {if (zooKeeper.exists(path, false) != null) {List<String> children = zooKeeper.getChildren(path, false);if (children.isEmpty()) {System.out.println("路径 " + path + " 下没有子节点");} else {System.out.println("路径 " + path + " 的子节点: " + children);// 遍历子节点并获取内容for (String child : children) {String childPath = path + (path.equals("/") ? "" : "/") + child;getNodeContent(childPath);}}} else {System.out.println("路径 " + path + " 不存在");}}
}

代码说明

  1. 依赖配置
    在Maven项目中,确保已添加ZooKeeper依赖(和之前注册示例相同):

    <dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.8.4</version>
    </dependency>
    
  2. 主要功能

    • connectToZookeeper():建立与ZooKeeper的连接,使用CountDownLatch确保连接成功后再执行后续操作。
    • getNodeContent():获取指定路径的节点数据,并可选地获取节点的元信息(如版本号、创建时间等)。
    • getChildren():获取指定路径下的子节点列表,并递归获取每个子节点的内容。
  3. 关键API

    • zooKeeper.getData(path, watch, stat)
      • path:目标节点路径。
      • watch:是否设置监视器(这里设为false,表示不监听变化)。
      • stat:返回节点的元信息(如版本号、时间戳等)。
      • 返回值:节点的字节数组数据。
    • zooKeeper.getChildren(path, watch)
      • 返回指定路径下的子节点名称列表。
    • zooKeeper.exists(path, watch)
      • 检查节点是否存在,避免操作不存在的节点时抛出异常。
  4. 运行前提

    • ZooKeeper服务已启动并运行在localhost:2181(或修改为你实际的地址)。
    • 路径/my-service已有数据(可以通过之前的注册示例创建)。

输出示例

假设/my-service节点已注册内容"service-data", 并有一个子节点/my-service/child1包含"child-data",运行程序可能输出:

成功连接到ZooKeeper
路径 /my-service 的内容: service-data
节点版本: 0
创建时间: 1677654321000
路径 /my-service 的子节点: [child1]
路径 /my-service/child1 的内容: child-data
节点版本: 0
创建时间: 1677654322000

扩展功能

  1. 监听节点变化
    如果需要实时感知节点内容的变化,可以添加Watcher:

    byte[] data = zooKeeper.getData(path, new Watcher() {@Overridepublic void process(WatchedEvent event) {System.out.println("节点 " + event.getPath() + " 发生变化,类型: " + event.getType());try {getNodeContent(path); // 再次获取最新数据} catch (Exception e) {e.printStackTrace();}}
    }, null);
    
  2. 异常处理
    添加更健壮的错误处理:

    try {getNodeContent(path);
    } catch (KeeperException.NoNodeException e) {System.out.println("节点不存在: " + path);
    } catch (KeeperException.ConnectionLossException e) {System.out.println("连接丢失,重试中...");// 实现重试逻辑
    }
    
  3. 服务发现场景
    在实际应用中,可以用此方法实现服务发现:

    String servicePath = "/services/service1";
    getNodeContent(servicePath); // 获取服务注册信息,如IP和端口
    

注意事项

  • 权限控制:如果节点设置了ACL(如ZooDefs.Ids.CREATOR_ALL_ACL),需要在客户端添加认证信息:
    zooKeeper.addAuthInfo("digest", "username:password".getBytes());
    
  • 性能考虑:频繁获取大数据或深层子节点可能影响性能,建议根据需求优化调用频率。
  • 连接管理:生产环境中应实现连接池或重试机制,避免连接断开导致失败。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com