Zookeeper客户端(使用Curator)

三、使用curator客户端

在pom.xml中加入依赖

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency> <dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.11.0</version>
</dependency>

直接上代码:

 /**
* Project Name:mk-project <br>
* Package Name:com.suns.zookeeper.curator <br>
*
* @author mk <br>
* Date:2018-10-31 14:03 <br>
*/ package com.suns.zookeeper.curator; 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 java.util.concurrent.TimeUnit; /**
* curator客户端使用
*
* 和原生zookeeper优点:
* 1.使用api更方便,功能更丰富
* 2.监听节点数据改变或者子节点变化,只需要订阅一次,便可以一直使用。而原生zookeeper的监听是一次性的,需要重复注册。
* 3.链式编程
*
* Curator包含了几个包:
* curator-framework:对zookeeper的底层api的一些封装
* curator-client:提供一些客户端的操作,例如重试策略等
* curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等
* ClassName: ZkCuratorTest <br>
* Description: <br>
* @author mk
* @Date 2018-10-31 14:03 <br>
* @version
*/
public class ZkCuratorTest { public static final String connect = "127.0.0.1:2181";
private static CuratorFramework curatorFramework = null;
private static String nodePath = "/curator1";
private static String nodeChildPath = "/curator1/n1/n11/n111/n1111"; public static void main(String[] args) throws Exception { //初始化
init(connect,5000); //监听节点数据改变或者子节点变化,只需要订阅一次,便可以一直使用。而原生zookeeper的监听是一次性的,需要重复注册。
listener(nodePath); //新增
create(nodePath,"n1");
//递归新增
createRecursion(nodeChildPath,"n1"); //查询
query(nodePath); TimeUnit.SECONDS.sleep(2); //修改
update(nodePath,"n11"); //单个节点删除
// delete(nodePath);
//递归删除
deleteRecursion(nodePath); } private static void deleteRecursion(String path) throws Exception {
Void aVoid = curatorFramework.delete().deletingChildrenIfNeeded().forPath(path);
System.out.println("delete:"+"["+path+"],result:"+aVoid);
} private static void delete(String path) throws Exception {
Void aVoid = curatorFramework.delete().forPath(path);
System.out.println("delete:"+"["+path+"],result:"+aVoid); } private static void update(String path, String data) throws Exception {
Stat stat = curatorFramework.setData().forPath(path, data.getBytes());
System.out.println("setData:"+"["+path+"],stat:"+stat); } private static void query(String path) throws Exception {
byte[] bytes = curatorFramework.getData().forPath(path);
System.out.println("query:"+"["+path+"],result:"+new String(bytes)); } private static void createRecursion(String path,String data) throws Exception {
String result = curatorFramework.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, data.getBytes());
System.out.println("create:"+"["+path+"-->"+data+"],result:"+result); } private static void create(String path, String data) throws Exception {
// Stat stat = curatorFramework.checkExists().forPath(path);
// if(null != stat){
// System.out.println("节点["+path+"]已存在,不能新增");
// return;
// }
String result = curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, data.getBytes());
System.out.println("create:"+"["+path+"-->"+data+"],result:"+result);
} private static void listener(String path) throws Exception { //监听节点内容改变
final NodeCache nodeCache = new NodeCache(curatorFramework, path);
nodeCache.start();
/*nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
System.out.println("节点内容发生变化----->"+nodeCache.getCurrentData());
}
});*/ //使用lambda表达式-jdk1.8以上
nodeCache.getListenable().addListener(()->{System.out.println("节点内容发生变化----->"+nodeCache.getCurrentData());}); //监听子节点改变
final PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework, path, true);
pathChildrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
/* pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
switch (pathChildrenCacheEvent.getType() ){
case CHILD_ADDED:
System.out.println("新增子节点"+pathChildrenCache.getCurrentData());
break;
case CHILD_UPDATED:
System.out.println("更新子节点"+pathChildrenCache.getCurrentData());
break;
case CHILD_REMOVED:
System.out.println("删除子节点"+pathChildrenCache.getCurrentData());
break;
default:break;
}
}
});*/
//使用lambda表达式-jdk1.8以上
pathChildrenCache.getListenable().addListener((curatorFramework,pathChildrenCacheEvent)->
{switch (pathChildrenCacheEvent.getType() ){
case CHILD_ADDED:
System.out.println("新增子节点"+pathChildrenCache.getCurrentData());
break;
case CHILD_UPDATED:
System.out.println("更新子节点"+pathChildrenCache.getCurrentData());
break;
case CHILD_REMOVED:
System.out.println("删除子节点"+pathChildrenCache.getCurrentData());
break;
default:break;
}}); } private static void init(String connect, int sessionTimeout) {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);//重试策略,初始等待1s,重试3次
//通过工厂获得CuratorFramework
curatorFramework = CuratorFrameworkFactory.builder()
.connectString(connect).connectionTimeoutMs(sessionTimeout).retryPolicy(retryPolicy).build();
curatorFramework.start();//开启连接
System.out.println("curatorFramework start :" +connect);
} } 运行截图:


Zookeeper客户端使用(使用Curator)的更多相关文章

  1. zookeeper客户端使用第三方(Curator)封装的Api操作节点

    1.为什么使用Curator? Curator本身是Netflix公司开源的zookeeper客户端: Curator  提供了各种应用场景的实现封装: curator-framework  提供了f ...

  2. Zookeeper客户端Curator基本API

    在使用zookeper的时候一般不使用原生的API,Curator,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsExceptio ...

  3. Zookeeper客户端Curator的使用,简单高效

    Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量. 1.引入依赖: ...

  4. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  5. 7.5 zookeeper客户端curator的基本使用 + zkui

    使用zookeeper原生API实现一些复杂的东西比较麻烦.所以,出现了两款比较好的开源客户端,对zookeeper的原生API进行了包装:zkClient和curator.后者是Netflix出版的 ...

  6. zookeeper(六):Zookeeper客户端Curator的API使用详解

    简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...

  7. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

  8. Zookeeper客户端Apache Curator

    本文不对Zookeeper进行介绍,主要介绍Curator怎么操作Zookeeper. Apache Curator是Apache ZooKeeper的Java / JVM客户端库,Apache Zo ...

  9. Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用、ZKClient、Curator)和Zookeeper会话

    一.Zookeeper原生API如何进行调用 准备工作: 首先在新建一个maven项目ZK-Demo,然后在pom.xml里面引入zk的依赖 <dependency> <groupI ...

随机推荐

  1. Spring RedisTemplate常用方法(List,Hash)

    @Autowired private RedisTemplate<String, String> redisTemplate; @Override public List<Strin ...

  2. java:LeakFilling (Linux)

    1.Nosql 列数据库,没有update,非关系型数据库: 为了解决高并发.高可扩展.高可用.大数据存储问题而产生的数据库解决方案,就是NoSql数据库.  NoSQL,泛指非关系型的数据库,NoS ...

  3. django使用session来保存用户登录状态

    先建好登录用的model,其次理解使用cookie和session的原理,一个在本机保存,一个在服务器保存 使用session好处,可以设置登录过期的时间, 编写views中login的函数 def ...

  4. C#反射动态创建实例并调用方法

    在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...

  5. Jquery(DOM和选择器)

    O(∩_∩)O~~~,今天简单整理了一下最近所学的Jquery知识.下面就总结一下. 首先,对于Jquery我们需要简单了解下: 1.Jquery是开放源代码的JS库, 2.Jquery操作是函数式编 ...

  6. Tensorflow 保存和载入训练过程

    本节涉及点: 保存训练过程 载入保存的训练过程并继续训练 通过命令行参数控制是否强制重新开始训练 训练过程中的手动保存 保存训练过程前,程序征得同意 一.保存训练过程 以下方代码为例: import ...

  7. Python爬虫学习==>第十章:使用Requests+正则表达式爬取猫眼电影

    学习目的: 通过一个一个简单的爬虫应用,初窥门径. 正式步骤 Step1:流程框架 抓取单页内容:利用requests请求目标站点,得到单个页面的html代码,返回结果: 正则表达式分析:根据html ...

  8. 微信小程序-T

    微信小程序安装完毕后,真机调试及预览(打开调试模式)有数据,其他类型无数据在微信公众号-开发-域名信息中绑定正确的域名即可 配置微信小程序合法域名微信公众号-开发微擎应用-基础设置微信app-site ...

  9. CISCO路由器WAN口动态ISP配置

        Building configuration... version 15.0 service timestamps debug datetime msec service timestamps ...

  10. windows 安装 celery 避坑指南,看这篇就够了