热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

zookeeper实现一个配置项的修改的小案例

节点pingipNode中的数据就是保存一个IP,多实例部署PingZookeeperDemo,通过ChangeNodeData,CreateNodeData,DeleteNodeData来

节点/ping/ipNode 中的数据就是保存一个IP,多实例部署PingZookeeperDemo ,通过ChangeNodeData,CreateNodeData,DeleteNodeData 来改变node 中的数据值


完整代码如下:

1. PingZookeeperDemo.java

   

package cn.east.hadoop.zookeeper.ping;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
* ping 一个zookeeper node节点中的数据ip
*
* @author East271536394
* @version 2013-6-20 下午2:09:45
*/
public class PingZookeeperDemo implements Watcher {

protected static final int SESSION_TIMEOUT = 10000;

protected static final String CONNECTION_STRING = "202.173.9.57:4181";

protected static String ROOT_PATH = "/ping";

private static String DEFAULT_IP = "202.173.10.58";

private static boolean init = false;

protected ZooKeeper zookeeper;

protected String probeIp = DEFAULT_IP;

protected String ipNode = ROOT_PATH + "/ipNode";

protected CountDownLatch cOnnectedSemaphore= new CountDownLatch(1);

/**
* 创建ZK连接
* @param connectString ZK服务器地址列表
* @param sessionTimeout Session超时时间
*/
public void createConnection(String connectString, int sessionTimeout) {
try {
zookeeper = new ZooKeeper(connectString, sessionTimeout, this);
init = true;
connectedSemaphore.await();
init = false;
createRoot();
} catch (InterruptedException e) {
System.out.println("连接创建失败,发生 InterruptedException");
e.printStackTrace();
} catch (IOException e) {
System.out.println("连接创建失败,发生 IOException");
e.printStackTrace();
}
}

/**
*
* 创建root 节点
*/
private void createRoot() {
try {
Stat s = zookeeper.exists(ROOT_PATH, false);
if (s == null) {
zookeeper.create(ROOT_PATH, "rootPath".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} else {
System.out.println("创建createRoot,已存在");
}
} catch (Exception se) {
System.out.println("创建createRoot,发生 Exception");
se.printStackTrace();
}
}

/**
*
* 从zookeeper节点中取出Ip
* @return
* @throws Exception
*/
private void initIp() throws Exception {
Stat s = zookeeper.exists(ipNode, true);
if (s == null) {
zookeeper.create(ipNode, probeIp.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} else {
System.out.println("创建ipNode,已存在");
probeIp = new String(zookeeper.getData(ipNode, true, null));
}
System.out.println("从zookeeper 中 " + ipNode + " 取值为: " + probeIp);
}

/**
* 进行探测IP
* 方法说明。
* @param ip
*/
private void probe() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String date = format.format(new Date());
System.out.println(date + ">>>>>>>>>>>>>正在探测 IP" + probeIp);
}

@Override
public void process(WatchedEvent event) {
System.out.println("收到事件通知:" + event.getState() + ",type :" + event.getType() + ",path :" + event.getPath()
+ "\n");
if (KeeperState.SyncCOnnected== event.getState()) {
if (init) {
System.out.println("connectedSemaphore.countDown()>>>>>>>>>>>>>>>>");
connectedSemaphore.countDown();
}
//模拟处理业务逻辑/ping/ipNode如果数据发生变化
//1. 更新节点
if (ipNode.equals(event.getPath()) && Event.EventType.NodeDataChanged == event.getType()) {
System.out.println(ipNode + "节点发生了数据变化>>>");
try {
changeIp();
} catch (Exception se) {
se.printStackTrace();
}
}
//2.删除节点
if (ipNode.equals(event.getPath()) && Event.EventType.NodeDeleted == event.getType()) {
System.out.println(ipNode + "节点已被删除>>>");
try {
resetIp();
} catch (Exception se) {
se.printStackTrace();
}
}
//3.创建节点
if (ipNode.equals(event.getPath()) && Event.EventType.NodeCreated == event.getType()) {
System.out.println(ipNode + "节点已被创建>>>");
try {
createIp();
} catch (Exception se) {
se.printStackTrace();
}
}
}
}

/**
*
* 取新的IP
* @throws Exception
*/
private void createIp() throws Exception {
probeIp = new String(zookeeper.getData(ipNode, false, null));
System.out.println("createIp>>>>>>>>>probeIp:" + probeIp);
//在创建后,对节点进行监控
zookeeper.exists(ipNode, true);
}

private void resetIp() throws Exception {
probeIp = "0.0.0.0";
System.out.println("resetIp>>>>>>>>>probeIp:" + probeIp);
//在删除后,对节点进行监控
zookeeper.exists(ipNode, true);
}

/**
*
* 取新的IP
* @throws Exception
*/
private void changeIp() throws Exception {
probeIp = new String(zookeeper.getData(ipNode, true, null));
}

public static void main(String[] args) throws Exception {
PingZookeeperDemo demo = new PingZookeeperDemo();
demo.createConnection(CONNECTION_STRING, SESSION_TIMEOUT);
demo.initIp();
while (true) {
Thread.sleep(5000);
demo.probe();
}
}
}

2. ChangeNodeData.java

package cn.east.hadoop.zookeeper.ping;

/**
* 类说明。
*
* @author East271536394
* @version 2013-6-20 下午2:55:53
*/
public class ChangeNodeData extends PingZookeeperDemo {

public void changeNodeData() {
try {
zookeeper.setData(ipNode, "202.173.10.88_change".getBytes(), -1);
String ip = new String(zookeeper.getData(ipNode, false, null));
System.out.println("新IP数据为:" + ip);
} catch (Exception se) {
System.out.println("设置" + ipNode + "节点数据异常");
se.printStackTrace();
}
}

public static void main(String[] args) {
ChangeNodeData change = new ChangeNodeData();
change.createConnection(CONNECTION_STRING, SESSION_TIMEOUT);
change.changeNodeData();
}
}


3. CreateNodeData.java

package cn.east.hadoop.zookeeper.ping;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;

/**
* 类说明。
*
* @author East271536394
* @version 2013-6-20 下午2:55:53
*/
public class CreateNodeData extends PingZookeeperDemo {

public void createNodeData() {
try {
zookeeper.create(ipNode, "202.173.10.89_newCreate".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("成功创建" + ipNode);
String ip = new String(zookeeper.getData(ipNode, false, null));
System.out.println("新IP数据为:" + ip);
} catch (Exception se) {
System.out.println("创建" + ipNode + "节点数据异常");
se.printStackTrace();
}
}

public static void main(String[] args) {
CreateNodeData create = new CreateNodeData();
create.createConnection(CONNECTION_STRING, SESSION_TIMEOUT);
create.createNodeData();
}
}


4. DeleteNodeData.java

package cn.east.hadoop.zookeeper.ping;

/**
* 类说明。
*
* @author East271536394
* @version 2013-6-20 下午2:55:53
*/
public class DeleteNodeData extends PingZookeeperDemo {

public void deleteNodeData() {
try {
zookeeper.delete(ipNode, -1);
System.out.println("删除成功"+ipNode);
} catch (Exception se) {
System.out.println("删除" + ipNode + "节点数据异常");
se.printStackTrace();
}
}

public static void main(String[] args) {
DeleteNodeData delete = new DeleteNodeData();
delete.createConnection(CONNECTION_STRING, SESSION_TIMEOUT);
delete.deleteNodeData();
}
}



结果如下:

收到事件通知:SyncConnected,type :None,path :null

connectedSemaphore.countDown()>>>>>>>>>>>>>>>>
创建createRoot,已存在
收到事件通知:SyncConnected,type :NodeCreated,path :/ping/ipNode

/ping/ipNode节点已被创建>>>
从zookeeper 中 /ping/ipNode 取值为: 202.173.10.58
createIp>>>>>>>>>probeIp:202.173.10.58
2013-06-20 05:14:02>>>>>>>>>>>>>正在探测 IP202.173.10.58
2013-06-20 05:14:07>>>>>>>>>>>>>正在探测 IP202.173.10.58
2013-06-20 05:14:12>>>>>>>>>>>>>正在探测 IP202.173.10.58
收到事件通知:SyncConnected,type :NodeDataChanged,path :/ping/ipNode

/ping/ipNode节点发生了数据变化>>>
2013-06-20 05:14:17>>>>>>>>>>>>>正在探测 IP202.173.10.88_change
2013-06-20 05:14:22>>>>>>>>>>>>>正在探测 IP202.173.10.88_change
2013-06-20 05:14:27>>>>>>>>>>>>>正在探测 IP202.173.10.88_change
收到事件通知:SyncConnected,type :NodeDeleted,path :/ping/ipNode

/ping/ipNode节点已被删除>>>
resetIp>>>>>>>>>probeIp:0.0.0.0
2013-06-20 05:14:32>>>>>>>>>>>>>正在探测 IP0.0.0.0
2013-06-20 05:14:37>>>>>>>>>>>>>正在探测 IP0.0.0.0
收到事件通知:SyncConnected,type :NodeCreated,path :/ping/ipNode

/ping/ipNode节点已被创建>>>
createIp>>>>>>>>>probeIp:202.173.10.89_newCreate
2013-06-20 05:14:42>>>>>>>>>>>>>正在探测 IP202.173.10.89_newCreate
2013-06-20 05:14:47>>>>>>>>>>>>>正在探测 IP202.173.10.89_newCreate
2013-06-20 05:14:52>>>>>>>>>>>>>正在探测 IP202.173.10.89_newCreate
2013-06-20 05:14:57>>>>>>>>>>>>>正在探测 IP202.173.10.89_newCreate




推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
author-avatar
老谢2502887117
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有