下面先写个简单的例子,把一个字符串写入到zookeeper当中。
第一步,先引入pom依赖如下:
org.apache.zookeeper
zookeeper
3.4.6
第二步,上代码:
package mypackage;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
public class LoadDataToZooKeeper {
private static final Logger logger = LoggerFactory.getLogger(LoadDataToZooKeeper.class);
public static String hosts = "";
private static final int SESSION_TIMEOUT = 5000;
protected CountDownLatch connectedSignal = new CountDownLatch(1);
protected static ZooKeeper zk;
// 连接zk
public void connect() {
try {
zk = new ZooKeeper(hosts,SESSION_TIMEOUT, new ConnWatcher());
} catch (IOException e) {
logger.info("zk连接失败!");
e.printStackTrace();
}
}
//监听
public class ConnWatcher implements Watcher{
public void process(WatchedEvent event) {
// 连接建立, 回调process接口时, 其event.getState()为KeeperState.SyncConnected
if (event.getState() == Event.KeeperState.SyncConnected) {
// 放开闸门, wait在connect方法上的线程将被唤醒
connectedSignal.countDown();
}
}
}public void loadToZK(String content) throws IOException {
connect();
//获得与zk的连接
try {
if(zk.exists("/xx/xx/parentNode", false) == null) { // 父节点不存在时创建
zk.create("/xx/xx/parentNode","xxxx".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
Stat stat = zk.exists("/xx/xx/parentNode/sonNode", false);
if(stat == null){//节点不存在时创建
zk.create("/xx/xx/parentNode/sonNode", content.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
} else {
//节点存在时写入
zk.setData("/xx/xx/parentNode/sonNode", content.getBytes(),-1);
}} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
logger.info("zk判断结点存在时异常!");
}}public static void main(String[] args) throws IOException {LoadDataToZooKeeper obj = new LoadDataToZooKeeper();
hosts = args[0];
// 你的zk所在ip,如:127.0.0.1:443
String content = "test...";
//获得mysql或文件中数据,这些数据是你要写到zookeeper中的
obj.loadToZK(content);
}
}
其实zookeeper很简单,简单到它只有不到10个api方法:
- String create(final String path, byte data[], List acl, CreateMode createMode)
创建znode节点,
参数:
path: 要写到zk哪个路径上
data: 要写哪些数据,把这些数据变成字节码
acl: 访问控制列表
createMode: 节点的类型,临时、顺序或两者。这是一个枚举
- void delete(final String path, int version)
删除某个节点
参数:
path: 节点路径
version: znode的当前版本
- Stat exists(final String path, Watcher watcher)
判断zk节点是否存在
参数:
path: 节点路径
watcher: 监听,当这个znode节点被改变时,会触发当前watcher
- Stat setData(final String path, byte data[], int version)
向节点中写入数据
参数:
path: 节点路径
data: 要写的数据(需要字节化)
version: znode的当前版本。每当数据更改时,zk会更新znode的版本号。
- byte[] getData(final String path, Watcher watcher, Stat stat)
从指定的znode获取数据
参数:
path: znode路径
watcher: 监视器类型的回调函数。
stat: 返回znode的元数据。
- List getChildren(final String path, Watcher watcher)
获取指定znode中的所有子节点
参数:
path: znode路径
watcher: 监视器类型的回调函数。
喜欢的话,请微信扫描下方二维码关注我!感谢支持!
文章图片
【zookeeper|zookeeper的简单例子带你认识zk的API】
推荐阅读
- 分布式集群|一起进阶学习JAVA(Zookeeper)
- zookeeper使用IDEA测试API出现KeeperException$ConnectionLossException解决思路
- Zookeeper集群与Curator客户端
- zookeeper|Zookeeper案例
- Java|乐观锁和悲观锁在zookeeper中的应用
- 拜占庭将军-分布式领域的幽灵
- java|应用 | Redis实现 主从,单例,集群,哨兵,配置应用
- spring-boot|zookeeper与grpc集成实现服务注册与发现
- zookeeper 启动报错 : KeeperErrorCode = NoNode for /XXX