首先创建一个Maven项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>groupId</groupId>
<artifactId>code</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.4-beta</version>
<type>pom</type>
</dependency> <!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency> </dependencies> </project>

pom.xml

package com.amber;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import java.io.IOException; /**
* zookeeper
* 连接zookeeper
* 创建znode
* 获取znode值
* 断开链接
*/
public class ZookeeperDemo {
private ZooKeeper zookeeper; /**
* 链接zookeeper
* @return
* @throws IOException
*/
public ZooKeeper zkConnect( ) throws IOException {
//zookeeper的ip:端口
String path = "127.0.0.1:2181";
//第二个参数是超时时间,第三个参数是设置观察者,现在可以先不管
zookeeper = new ZooKeeper(path, 20 * 1000, null);
return zookeeper;
} /**
* 创建znode节点
* @param path znode的路径
* @param value znode的值
* @param watcher
* @param node //创建node的模式
* @throws KeeperException
* @throws InterruptedException
*/
public void createZnode(String path, byte[] value, Watcher watcher, CreateMode node ) throws KeeperException, InterruptedException {
zookeeper.create(path, value, ZooDefs.Ids.OPEN_ACL_UNSAFE, node);
} /**
* 通过path获得znode的值
* @param path
* @return
* @throws KeeperException
* @throws InterruptedException
*/
public String getZnodeValue(String path ) throws KeeperException, InterruptedException {
//第二个值是代表是否开启监听,这里还是先不管.第三个参数就是结构体
byte[] data = zookeeper.getData(path, false, new Stat());
return new String(data);
} public void close() {
try {
if (zookeeper != null) {
zookeeper.close();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
ZookeeperDemo zookeeperDemo = new ZookeeperDemo();
//获取连接
ZooKeeper zooKeeper = zookeeperDemo.zkConnect();
//创建znode
zookeeperDemo.createZnode("/amber", "hahaha".getBytes(), null, CreateMode.PERSISTENT);
//获取znode的值
String znodeValue = zookeeperDemo.getZnodeValue("/amber");
System.out.println(znodeValue); zookeeperDemo.close(); }
}

ZookeeperDemo

通过上面的代码就可以实现通过java代码操控zookeeper.但是你可能有疑惑的是

  • Create.PERSISTENT是什么
  • watcher是什么

Znode的四种类型

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
// package org.apache.zookeeper; import org.apache.yetus.audience.InterfaceAudience.Public;
import org.apache.zookeeper.KeeperException.BadArgumentsException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; @Public
public enum CreateMode {
PERSISTENT(0, false, false),
PERSISTENT_SEQUENTIAL(2, false, true),
EPHEMERAL(1, true, false),
EPHEMERAL_SEQUENTIAL(3, true, true); private static final Logger LOG = LoggerFactory.getLogger(CreateMode.class);
private boolean ephemeral;
private boolean sequential;
private int flag; private CreateMode(int flag, boolean ephemeral, boolean sequential) {
this.flag = flag;
this.ephemeral = ephemeral;
this.sequential = sequential;
} public boolean isEphemeral() {
return this.ephemeral;
} public boolean isSequential() {
return this.sequential;
} public int toFlag() {
return this.flag;
} public static CreateMode fromFlag(int flag) throws KeeperException {
switch(flag) {
case 0:
return PERSISTENT;
case 1:
return EPHEMERAL;
case 2:
return PERSISTENT_SEQUENTIAL;
case 3:
return EPHEMERAL_SEQUENTIAL;
default:
String errMsg = "Received an invalid flag value: " + flag + " to convert to a CreateMode";
LOG.error(errMsg);
throw new BadArgumentsException(errMsg);
}
}
}

CreateMode


znode分四种类型
PERSISTENT                持久节点  对应命令 create path value

PERSISTENT_SEQUENTIAL     顺序自动编号持久化节点,这种节点会根据当前已存在的节点数自动加 1 (有序持久节点)create -s path value

EPHEMERAL                 临时节点, 客户端session超时这类节点就会被自动删除 create -e path value

EPHEMERAL_SEQUENTIAL      临时自动编号节点 (临时有序节点) create -s -e path value
CreateMode是一个枚举类型,里面有四个对象分别是.表示的就是Znode的类型
 PERSISTENT(0, false, false), //持久节点
PERSISTENT_SEQUENTIAL(2, false, true), //有序节点
EPHEMERAL(1, true, false), //临时节点 只存在本次session中,当服务器重启后就会不见
EPHEMERAL_SEQUENTIAL(3, true, true); //有序临时节点 重启后数据不见

在创建持久节点(PERSISTENT)的时候,应该注意因为znode的path是不允许重复的,因此在创建持久节点之前,应先判断节点是否存在。但是持久有序节点(PERSISTENT_SEQUENTIAL)会自动在/path后面跟上dataVersion序号

if (zooKeeper.exists(path, false) == null) {
zookeeperWatchDemo.createZnode(path, value.getBytes(), null, CreateMode.PERSISTENT);
}

watcher

Zookeeper支持发布订阅功能,引入了watcher机制进行监听。当数据进行变动以后,可以及时通知客户端,数据进行了变动,并且把相应的时间通知给Watcher的Client。

watcher的特性:

  • Watcher一次性触发器:只能监听一次,是一个一次性的动作,如果需要监听多次,那么应该递归
  • 可以使用系统默认的watcher,也可以自定义Watcher.自定义Watcher必须实现
    org.apache.zookeeper.Watcher接口
  • Zookeeper的getData(),getChildren(),exists()都可以设置Watch选项。当watch为false的时候,或者watcher为null的时候代表不开启watch
new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
triggerWatch(path);
}
package com.amber;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat; import java.io.IOException; public class ZookeeperWatchDemo {
private ZooKeeper zookeeper;
private String oldValue = "";
private String newValue = "";
public ZooKeeper zkConnect( ) throws IOException {
String path = "127.0.0.1:2181";
zookeeper = new ZooKeeper(path, 20 * 1000, null);
return zookeeper;
} public void createZnode(String path, byte[] value, Watcher watcher, CreateMode node ) throws KeeperException, InterruptedException {
zookeeper.create(path, value, ZooDefs.Ids.OPEN_ACL_UNSAFE, node);
} public String getZnodeValue(final String path ) throws KeeperException, InterruptedException {
byte[] data = zookeeper.getData(path, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
triggerWatch(path);
}
}, new Stat());
oldValue = new String(data);
return new String(data);
} public boolean triggerWatch (String path) {
byte[] data = new byte[0];
try {
data = zookeeper.getData(path, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
triggerWatch(path);
}
}, new Stat());
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
newValue = new String(data);
if (oldValue.equals(newValue)) {
System.out.println("on change");
return false;
} else {
System.out.println("oldvalue: " + oldValue + "new value: " + newValue);
oldValue = newValue;
return true;
}
} public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
//创建
ZookeeperWatchDemo zookeeperWatchDemo = new ZookeeperWatchDemo();
ZooKeeper zooKeeper = zookeeperWatchDemo.zkConnect();
String path = "/amberas";
String value = "hahahahaha";
if (zooKeeper.exists(path, false) == null) {
zookeeperWatchDemo.createZnode(path, value.getBytes(), null, CreateMode.PERSISTENT);
} String znodeValue = zookeeperWatchDemo.getZnodeValue(path);
System.out.println(znodeValue); Thread.sleep(1000 * 60 * 50);
}
}

ZookeeperWatchDemo

zookeeper - 通过java代码连接zookeeper(2)的更多相关文章

  1. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  2. mongodb3.0分片及java代码连接操作测试(开启用户验证)

    最近抽时间搭建了一下mongodb简单的分片,整个过程还算是蛮顺利,只不过在用户验证这一块遇到了一些问题,好在最后终于搞定. 一.服务器搭建过程: 1.安装四个mongodb:一个作为config.一 ...

  3. zookeeper java api(使用java代码操作zookeeper)

    1 导入相关的pom依赖 <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId&g ...

  4. java代码连接本地redis数据库

    关于redis的介绍在这里就不说了.今天主要讲解,如何连接redis.连接之前.必须要做的几点: 一.安装redis.下载服务和客户端,然后 二.启动redis服务. 经过这两步的测通以后.我们只需要 ...

  5. java代码连接oracle数据库的方法

    oracle连接数据库的方式和mysql是大同小异的,主要的困难点在于oracle的数据库驱动包和依赖只有官方提供,如果你是用maven添加依赖的话,需要自己从官网下载jar包安装到你本地的maven ...

  6. Zookeeper的java客户端API使用方法(五)

    前面几篇博文,我们简单的介绍了一下zookeeper,如何安装zookeeper集群,以及如何使用命令行等.这篇博文我们重点来看下Zookeeper的java客户端API使用方式. 创建会话 客户端可 ...

  7. 12. ZooKeeper之Java客户端API使用—创建会话。

    转自:https://blog.csdn.net/en_joker/article/details/78686649 客户端可以通过创建一个ZooKeeper(org.apache.zookeeper ...

  8. 不使用spring的情况下原生java代码两种方式操作mongodb数据库

    由于更改了mongodb3.0数据库的密码,导致这几天storm组对数据进行处理的时候,一直在报mongodb数据库连接不上的异常.   主要原因实际上是和mongodb本身无关的,因为他们改的是配置 ...

  9. 使用非java代码编程

    使用非JAVA代码     JAVA语言及其标准API(应用程序编程接口)应付应用程序的编写已绰绰有余.但在某些情况下,还是必须使用非JAVA编码.例如,我们有时要访问操作系统的专用特性,与特殊的硬件 ...

随机推荐

  1. 第六届蓝桥杯java b组第8题

    乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的n瓶 ...

  2. Python 为什么要保留显式的 self ?

    花下猫语:前两天,我偶然在一个知识星球(刘欣老师的"码农翻身")里看到一篇主题,刘老师表示 Python 的类方法非要带个 self,而不像其它语言那样隐藏起来,这让人很不爽.我对 ...

  3. 读《深入理解Elasticsearch》点滴-multi_match

    区分按字段为中心的查询.词条为中心的查询 注意高频词项被高得分词项(冷僻的词项)取代的问题 1.best_fields :适用于多字段查询且查询相同文本:得分取其中一个字段的最高分.可通过tie_br ...

  4. 从github下载的vue项目启动宝Cannot Get错误

    从github下载的vue项目启动宝Cannot Get错误,网上参考出现该错误来源很多,这里先总结遇到的第一个解决方法. 参考地址: https://www.cnblogs.com/anns/p/7 ...

  5. 3. Git与TortoiseGit基本操作

    1. GitHub操作 本节先简单介绍 git 的使用与操作, 然后再介绍 TortoiseGit 的使用与操作. 先看看SVN的操作吧, 最常见的是 检出(Check out ...), 更新 (U ...

  6. Apache Kylin 概述

    1 Kylin是什么 今天,随着移动互联网.物联网.AI等技术的快速兴起,数据成为了所有这些技术背后最重要,也是最有价值的"资产".如何从数据中获得有价值的信息?这个问题驱动了相关 ...

  7. 利用 SASS 简化 `nth-child` 样式的生成

    考察如下的 HTML 片段,通过 CSS 的 nth-child() 伪选择器实现列表的颜色循环,比如每三个一次循环. <ul> <li>1</li> <li ...

  8. vue父子组件钩子函数的执行顺序

    加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount-& ...

  9. vue3.0的安装使用

    关于旧版本 Vue CLI 的包名称由 vue-cli 改成了 @vue/cli. 如果你已经全局安装了旧版本的 vue-cli (1.x 或 2.x),你需要先通过 npm uninstall vu ...

  10. python编程基础之二

    交互式: 此处以windows为例:开始->运行->cmd,输入python 交互式界面 优点:即时,所见即所得 缺点:代码不可复用,根本无法进行维护 退出:exit() 代码是顺序执行: ...