Curator 的监听

如果要使用类似Wather的监听功能Curator必须依赖一个jar包,Maven依赖:

<dependency>

<groupld>org.apache.curator</groupld>

<artifactld>curator-recipes</artifactld>

<version>2.4.2</version>

</dependency>

有了这个依赖包,我们使用NodeCache的方式去客户端实例中注册一个监听缓存,然后实现对应的监听方法即可,这里我们主要有俩种监听方式:

NodeCacheListener:监听节点的新增、修改操作。

PathChildrenCacheListener:监听子节点的新增、修改、删除操作。 只能监听子一级节点,子节点的子节点是不能监听的

NodeCacheListener demo

package bjsxt.curator.watcher;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.api.BackgroundCallback;

import org.apache.curator.framework.api.CuratorEvent;

import org.apache.curator.framework.recipes.cache.NodeCache;

import org.apache.curator.framework.recipes.cache.NodeCacheListener;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.data.Stat;

public class CuratorWatcher1 {

/** zookeeper地址 */

static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";

/** session超时时间 */

static final int SESSION_OUTTIME = 5000;//ms

public static void main(String[] args) throws Exception {

//1 重试策略:初试时间为1s 重试10次

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);

//2 通过工厂创建连接

CuratorFramework cf = CuratorFrameworkFactory.builder()

.connectString(CONNECT_ADDR)

.sessionTimeoutMs(SESSION_OUTTIME)

.retryPolicy(retryPolicy)

.build();

//3 建立连接

cf.start();

//4 建立一个cache缓存  第三个参数为是否压缩

final NodeCache cache = new NodeCache(cf, "/super", false);

cache.start(true);

cache.getListenable().addListener(new NodeCacheListener() {

/**

 * <B>方法名称:</B>nodeChanged<BR>

 * <B>概要说明:</B>触发事件为创建节点和更新节点,在删除节点的时候并不触发此操作。<BR>

 * @see org.apache.curator.framework.recipes.cache.NodeCacheListener#nodeChanged()

 */

@Override

public void nodeChanged() throws Exception {

System.out.println("路径为:" + cache.getCurrentData().getPath());

System.out.println("数据为:" + new String(cache.getCurrentData().getData()));

System.out.println("状态为:" + cache.getCurrentData().getStat());

System.out.println("---------------------------------------");

}

});

Thread.sleep(1000);

cf.create().forPath("/super", "123".getBytes());

Thread.sleep(1000);

cf.setData().forPath("/super", "456".getBytes());

Thread.sleep(1000);

cf.delete().forPath("/super");

Thread.sleep(Integer.MAX_VALUE);

}

}

执行结果:

PathChildrenCacheListener demo

package bjsxt.curator.watcher;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.api.BackgroundCallback;

import org.apache.curator.framework.api.CuratorEvent;

import org.apache.curator.framework.recipes.cache.NodeCache;

import org.apache.curator.framework.recipes.cache.NodeCacheListener;

import org.apache.curator.framework.recipes.cache.PathChildrenCache;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;

import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;

import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.data.Stat;

public class CuratorWatcher2 {

/** zookeeper地址 */

static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";

/** session超时时间 */

static final int SESSION_OUTTIME = 5000;//ms

public static void main(String[] args) throws Exception {

//1 重试策略:初试时间为1s 重试10次

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);

//2 通过工厂创建连接

CuratorFramework cf = CuratorFrameworkFactory.builder()

.connectString(CONNECT_ADDR)

.sessionTimeoutMs(SESSION_OUTTIME)

.retryPolicy(retryPolicy)

.build();

//3 建立连接

cf.start();

//4 建立一个PathChildrenCache缓存,第三个参数为是否接受节点数据内容 如果为false则不接受

PathChildrenCache cache = new PathChildrenCache(cf, "/super", true);

//5 在初始化的时候就进行缓存监听  

//参数为 POST_INITIALIZED_EVENT事件触发

// BUILD_INITIAL_CACHE 只监听当前节点

cache.start(StartMode.POST_INITIALIZED_EVENT);

cache.getListenable().addListener(new PathChildrenCacheListener() {

/**

 * <B>方法名称:</B>监听子节点变更<BR>

 * <B>概要说明:</B>新建、修改、删除<BR>

 * @see org.apache.curator.framework.recipes.cache.PathChildrenCacheListener#childEvent(org.apache.curator.framework.CuratorFramework, org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent)

 */

@Override

public void childEvent(CuratorFramework cf, PathChildrenCacheEvent event) throws Exception {

switch (event.getType()) {

case CHILD_ADDED:

System.out.println("CHILD_ADDED :" + event.getData().getPath());

System.out.println("CHILD_ADDED :" +new String (event.getData().getData(),”utf-8”));

break;

case CHILD_UPDATED:

System.out.println("CHILD_UPDATED :" + event.getData().getPath());

System.out.println("CHILD_UPDATED :" + new String (event.getData().getData(),”utf-8”));

break;

case CHILD_REMOVED:

System.out.println("CHILD_REMOVED :" + event.getData().getPath());

System.out.println("CHILD_REMOVED :" + new String (event.getData().getData(),”utf-8”));

break;

default:

break;

}

}

});

//创建本身节点不发生变化

cf.create().forPath("/super", "init".getBytes());

//添加子节点

Thread.sleep(1000);

cf.create().forPath("/super/c1", "c1内容".getBytes());

Thread.sleep(1000);

cf.create().forPath("/super/c2", "c2内容".getBytes());

//修改子节点

Thread.sleep(1000);

cf.setData().forPath("/super/c1", "c1更新内容".getBytes());

//删除子节点

Thread.sleep(1000);

cf.delete().forPath("/super/c2");

//删除本身节点

Thread.sleep(1000);

cf.delete().deletingChildrenIfNeeded().forPath("/super");

Thread.sleep(Integer.MAX_VALUE);

}

}

运行结果:

如果将

PathChildrenCache cache = new PathChildrenCache(cf, "/super", true);

改为

PathChildrenCache cache = new PathChildrenCache(cf, "/super", false);

再次执行

建立一个PathChildrenCache缓存,第三个参数为是否接受节点数据内容 如果为false则不接受,监听的时候获取不到节点数据

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA代码搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值