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. pfSense-2.4.4安装教程

    一.说明 1.1 pfSense是什么 pfSense是基于FreeBSD的.开源中最为可靠(World's Most Trusted Open Source Firewall)的.可与商业级防火墙一 ...

  2. vscode keys

    // 快捷键设置 keyiing.json // 将键绑定放入此文件中以覆盖默认值 [ /* // 转换大写 { "key" : "ctrl+shift+u", ...

  3. 和系统运行状况相关的Shell命令总结

    1.  Linux的实时监测命令(watch):    watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的手动运行.该命令最为常用的两个选项是-d和-n,其中-n表 ...

  4. proxy Static方式

    package com.xk.spring.kp04_aop.proxy.s1_static; public interface IStudentService { public void save( ...

  5. Android开发 ---基本UI组件5:监听下拉选项,动态绑定下拉选项、全选/反选,取多选按钮的值,长按事件,长按删除,适配器的使用,提示查询数据,activity控制多按钮

    效果图: 效果描述: 1.当点击 1 按钮后,进入选择城市的页面,会监听到你选中的城市名称:动态为Spinner绑定数据 2.当点击 2 按钮后,进入自动查询数据页面,只要输入首字母,就会动态查找以该 ...

  6. Java 1.7 NQuery

    package org.rx.common; import java.lang.reflect.Array; import java.util.*; /** * Created by wangxiao ...

  7. [Java] [Lock] [Synchronized VS ReentrantLock]

    Overview java编写多线程程序时,为了保证线程安全,需要对数据进行同步,经常用到的两种同步方式就是synchronized和重入锁ReentrantLock. 相似点 都是加锁方式 都是阻塞 ...

  8. node.js安装全攻略

    node.js学习也有近一年之久了,自开始以来,能遇到各种问题,就拿安装来说,总能遇到稀奇古怪的问题,但每次谷歌,或者百度,都能找到解决办法,逐渐也就养成了百度或者谷歌的毛病! 正常安装 第一步:下载 ...

  9. mysql中外键的创建与删除

    外键的创建 方法1:创建表的时候设置(外键名随机生成) 1.前提条件,必须要有一个主表,这里设为persons 2.主表中必须设置主键字段primary key,这里设为id_p //创建数据库dat ...

  10. python 实现快速排序和插入排序

    def quick_sort(data): if len(data)<2 or (len(data)==2 and data[0]<=data[1]): #[2,3]此情况会死循环 所以加 ...