package com.ourteam;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.nio.charset.Charset;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* package:com.ourteam
* Created by RenQi on 2019/3/21 0021.
* Description:
*/
public class ZKTest { private static final String ZK_ADDRESS = "192.168.31.138:2181,192.168.31.139:2182,192.168.31.140:2183"; private static final String ZK_PATH = "test"; CuratorFramework zkclient = null; /**
* 两种建立连接的方式:项目中往往使用这一种
*
* @throws Exception
*/
@Before
public void init() throws Exception {
System.out.println("init..");
/**
* 未加权限设置:
* connectString:连接字符串中间用分号隔开,
* sessionTimeoutM:ssession过期时间,
* connectionTimeoutMs:连接超时时间,
* retryPolicyc:连接重试策略,
* namespace:操作的目录地址
*/
// 重连策略:每1一秒重试一次,最大重试次数3次
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
zkclient = CuratorFrameworkFactory.builder()
.connectString(ZK_ADDRESS)
.sessionTimeoutMs(50000)
.retryPolicy(retryPolicy)
.namespace(ZK_PATH)
.build();
zkclient.start();
} @After
public void after() {
//zkclient.close();
} /**
* 查看节点是否存在
*/
public boolean isExisted(final String path) {
try {
Stat stat = zkclient.checkExists().forPath(path);
return null != stat;
} catch (Exception e) {
e.printStackTrace();
System.out.println("error");
return false;
}
} /**
* 创建节点(默认:持久):永久存在
*
* @param path
* @param value utf-8格式
* @throws Exception
*/
public void createNode(String path, String value) throws Exception {
if (isExisted(path)) {
this.setData(path, value);
} else {
zkclient.create()
.creatingParentsIfNeeded() //如果path的父目录不存在,则同时穿件父目录
.forPath(path, value.getBytes(Charset.forName("UTF-8")));
} } /**
* 创建临时节点:客户端退出时自动删除
*
* @param path
* @param value
* @throws Exception
*/
public void createEphemeral(String path, String value) throws Exception {
zkclient.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath(path, value.getBytes(Charset.forName("UTF-8")));
} /**
* 创建临时顺序节点
*
* @param path
* @param value
* @return
* @throws Exception
*/
public String createEphemeralSequential(String path, String value) throws Exception {
return zkclient.create()
.withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
.forPath(path, value.getBytes(Charset.forName("UTF-8")));
} /**
* 创建持久顺序节点:
*
* @param path
* @param value
* @return
* @throws Exception
*/
public String createPersistentSequentia(String path, String value) throws Exception {
return zkclient.create()
.withMode(CreateMode.PERSISTENT_SEQUENTIAL)
.forPath(path, value.getBytes(Charset.forName("UTF-8")));
} /**
* 为节点赋值:
*
* @param path
* @param value
* @throws Exception
*/
public void setData(String path, String value) throws Exception {
zkclient.setData().forPath(path, value.getBytes(Charset.forName("UTF-8")));
} /**
* 删除节点
*
* @param path
* @throws Exception
*/
public void delete(String path) throws Exception {
zkclient.delete().forPath(path);
} /**
* 获取节点数据
*
* @param path
* @return
* @throws Exception
*/
public String getNodeData(String path) throws Exception {
return new String(zkclient.getData().forPath(path), Charset.forName("UTF-8"));
} /**
* 获取path的命名空间-当前路径前缀("todd/t4")
*
* @param path
* @return
* @throws Exception
*/
public String getNameSpace(String path) throws Exception {
return zkclient.getNamespace();
} /**
* 获取节点的孩子节点
*
* @param path 当key为 '/'时返回的是命名空间下根节点列表
* @return
* @throws Exception
*/
public List<String> getChildrenKeys(String path) throws Exception {
List<String> result = zkclient.getChildren().forPath(path);
Collections.sort(result, new Comparator<String>() {
@Override
public int compare(final String o1, final String o2) {
return o2.compareTo(o1);
}
});
return result;
} /**
* 递归删除节点.若不递归删除,则该路径下包含子节点则报非空异常
*
* @param path
* @throws Exception
*/
public void delNode(String path) throws Exception {
if (this.isExisted(path)) {
zkclient.delete()
.deletingChildrenIfNeeded()
.forPath(path);
}
} /*===================节点监听:有三种方式 使用Cache==========================*/ /**
* Path Cache:监视一个路径下--孩子结点的创建 、删除、结点数据的更新,产生的事件会传递给注册的PathChildrenCacheListener。
* Node Cache:监视一个结点的创建、更新、删除,并将结点的数据缓存在本地。
* Tree Cache:Path Cache和Node Cache的"合体",监视路径下的创建、更新、删除事件,并缓存路径下所有孩子结点的数据。
*/ /**
* 子节点监听: 删除节点后不在监听事件变化
*
* @param path
* @throws Exception
*/
private void addChildWatcher(String path) throws Exception {
PathChildrenCache childrenCache = new PathChildrenCache(zkclient, path, true); PathChildrenCacheListener childrenCacheListener = new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
System.out.println("开始进行事件分析:-----");
ChildData data = event.getData();
switch (event.getType()) {
case CHILD_ADDED:
System.out.println("CHILD_ADDED:"
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
case CHILD_REMOVED:
System.out.println("CHILD_REMOVED : "
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
case CHILD_UPDATED:
System.out.println("CHILD_UPDATED : "
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
default:
break;
}
}
};
childrenCache.getListenable().addListener(childrenCacheListener);
System.out.println("Register zk watcher successfully!");
childrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
} /**
* 监听节点的变化: 节点的创建、数据变化。删除节点不发生事件监听。删除节点重新建立发生事件监听。
*
* @param path
* @throws Exception
*/
private void addNodeWatcher(String path) throws Exception {
final NodeCache dataWatch = new NodeCache(zkclient, path);
dataWatch.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("path : " + dataWatch.getCurrentData().getPath());
System.out.println("data : " + new String(dataWatch.getCurrentData().getData()));
}
});
dataWatch.start();
} /**
* 监听节点和子节点变化:删除节点再次创建--继续监听
*
* @param path
* @throws Exception
*/
private void addNodeAndChildWatcher(String path) throws Exception {
//设置节点的cache
TreeCache treeCache = new TreeCache(zkclient, path);
//设置监听器和处理过程
treeCache.getListenable().addListener(new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
ChildData data = event.getData();
if (data != null) {
switch (event.getType()) {
case NODE_ADDED:
System.out.println("NODE_ADDED : "
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
case NODE_REMOVED:
System.out.println("NODE_REMOVED : "
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
case NODE_UPDATED:
System.out.println("NODE_UPDATED : "
+ data.getPath()
+ " 数据:"
+ new String(data.getData(), Charset.forName("UTF-8")));
break;
default:
break;
}
} else {
System.out.println("data is null : " + event.getType());
}
} });
//开始监听
treeCache.start();
} @Test
public void test01() throws Exception {
// createNode("/temp","tempValue");
// boolean existed = isExisted("/temp");
// System.out.println(existed);
//
// createNode("/zktest01", "x");
// createEphemeral("/temp2", "temp2");
// System.out.println(createEphemeralSequential("/testsghy", "lishi"));
// System.out.println(createPersistentSequentia("/testsghy", "aa"));
// setData("/zktest01", "test11111");
// delete("/zktest01");
// System.out.println(getNodeData("/zktest01"));
// System.out.println(getNameSpace("/zktest01"));
// List<String> childrenKeys = getChildrenKeys("/");
// for (String key : childrenKeys) {
// System.out.println(key);
// }
// delNode("/zktest02");
//
// addNodeWatcher("/zktest02");
// addChildWatcher("/zktest02");
// addNodeAndChildWatcher("/zktest02");
// Thread.sleep(500000);
} }

7、Curator的常规操作的更多相关文章

  1. FTP服务器常规操作

    导读 FTP协议是Internet文件传输的基础,它是由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据.下面就由我给大家简单介绍一下 ...

  2. Apache服务器常规操作

    导读 Apache是世界上排名第一的Web服务器,50%以上的Web服务器都在使用Apache,它几乎可以在所有计算机平台上运行.下面就由我给大家说说Apache服务器的一些常规操作. Apache服 ...

  3. mysql服务器的常规操作

    mysql服务器的常规操作 导读 MySQL是一个小型关系数据库管理系统,目前被广泛的应用在Internet上的中小型网站中,体积小.速度快.总体拥有成本低,尤其是开放源码这一特点,使得许多中小型网站 ...

  4. 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)

    有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...

  5. Mongodb常规操作【一】

    Mongodb是一种比较常见的NOSQL数据库,数据库排名第四,今天介绍一下Net Core 下,常规操作. 首先下C# 版的驱动程序 "MongoDB.Driver",相关依赖包 ...

  6. C#通过Ado.net对连接数据库并进行添加删除等常规操作的代码

    如下资料是关于C#通过Ado.net对连接数据库并进行添加删除等常规操作的内容. static string sqlcon = "server=.;database=;Integrated ...

  7. react-native 常规操作

    1.  关闭xcode打开模拟器的快捷键 , 等常规操作 https://www.jianshu.com/p/f6723f3406b7

  8. Linux 下的 netfilter 认识与常规操作

    Linux 下的 netfilter 认识与常规操作 前言 博客写到今天,1年7个月.可是包含所有写作经历,这个时间线可以达到三年. 上次更新了一篇 "镇站之宝" ,也是本站阅读量 ...

  9. 数据库mysql的常规操作

    1. 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 简单来说是本身可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进 ...

随机推荐

  1. EOS使用

    公司要玩区块链,听说EOS交易快,就弄来玩玩.弄了一天终于编译成功了. Scanning dependencies of target nodeos [%] Building CXX object p ...

  2. 八大排序算法——插入排序(动图演示 思路分析 实例代码java 复杂度分析)

    一.动图演示 二.思路分析 例如从小到大排序: 1.  从第二位开始遍历, 2.  当前数(第一趟是第二位数)与前面的数依次比较,如果前面的数大于当前数,则将这个数放在当前数的位置上,当前数的下标-1 ...

  3. JJTree Tutorial for Advanced Java Parsing

    The Problem JJTree is a part of JavaCC is a parser/scanner generator for Java. JJTree is a preproces ...

  4. vue 自定义组件使用v-model

    <input v-model="something"> v-model指令其实是下面的语法糖包装而成: <input :value="something ...

  5. Sonya and Robots(CodeForces 1004C)

    Since Sonya is interested in robotics too, she decided to construct robots that will read and recogn ...

  6. CF727F [Polycarp's problems] & [EX_Polycarp's problems]

    原题题意 给出长度为n的有序数组,m次询问,每次给出一个正整数x.你要删除数组中最少的元素,使得数组中的前缀和+x都为非负整数.允许离线,n≤750,m≤200,000. 原题思路 首先注意到,x能成 ...

  7. Problem C: 类的初体验(III)

    Description 定义一个类Data,只有一个double类型的属性和如下4个方法: 1.   缺省构造函数,将属性初始化为0,并输出“Initialize a data 0”. 2.  带参构 ...

  8. Codeforces Round #244 (Div. 2) C. Checkposts (tarjan 强连通分量)

    题目:http://codeforces.com/problemset/problem/427/C 题意:给你n座城市,m条有向道路,然后有一个机制,你在某一个城市设置检查点,那么被设置的检查点受保护 ...

  9. 测试同学必备抓包工具--charles之mock数据

    charles中有三个是我经常用到来mock数据的. 一. 打断点--Breakpoints 1. 先切换查看‘Structure’模式 2. 找到目标链接,对其父级进行打断点,如图 3. 取消掉再次 ...

  10. C语言里有没有像C++里面的sort函数一样的函数?有!

    C 库函数 - qsort() 描述 C 库函数 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void ...