使用 Zookeeper 的 Java API 可以方便地进行各种操作,如创建节点、获取节点数据、设置节点数据、删除节点等。以下是详细的步骤和代码示例,涵盖如何使用 Zookeeper 的 Java API。
1. 添加依赖
首先,需要在项目中添加 Zookeeper 的依赖。以下是 Maven 和 Gradle 的依赖配置:
Maven
在 pom.xml 中添加 Zookeeper 依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.7.0</version>
</dependency>
Gradle
在 build.gradle 中添加 Zookeeper 依赖:
dependencies {
implementation 'org.apache.zookeeper:zookeeper:3.7.0'
}
2. 创建 Zookeeper 客户端
通过 ZooKeeper 类来创建 Zookeeper 客户端并连接到 Zookeeper 服务器。
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.WatchedEvent;
public class ZookeeperClient {
private static final String ZK_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
private ZooKeeper zooKeeper;
public void connect() throws Exception {
zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("Received event: " + event);
}
});
}
public void close() throws InterruptedException {
if (zooKeeper != null) {
zooKeeper.close();
}
}
public static void main(String[] args) {
ZookeeperClient client = new ZookeeperClient();
try {
client.connect();
// 在这里执行 Zookeeper 操作
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
3. 基本操作示例
以下是一些常见的 Zookeeper 操作示例。
创建节点
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;
public void createNode(String path, String data) throws Exception {
byte[] dataBytes = data.getBytes();
String createdPath = zooKeeper.create(path, dataBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Created node: " + createdPath);
}
获取节点数据
public String getNodeData(String path) throws Exception {
byte[] dataBytes = zooKeeper.getData(path, false, null);
return new String(dataBytes);
}
设置节点数据
public void setNodeData(String path, String data) throws Exception {
byte[] dataBytes = data.getBytes();
zooKeeper.setData(path, dataBytes, -1);
System.out.println("Set data for node: " + path);
}
删除节点
public void deleteNode(String path) throws Exception {
zooKeeper.delete(path, -1);
System.out.println("Deleted node: " + path);
}
4. 监视节点变化
通过 Watcher 类可以监视节点的变化。当节点的数据或状态发生变化时,会触发相应的事件。
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
public void watchNode(String path) throws Exception {
zooKeeper.exists(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("Node changed: " + event.getPath());
// 重新设置监视器
try {
watchNode(event.getPath());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
5. 示例代码
以下是一个完整的示例代码,展示了如何使用 Zookeeper 的 Java API 进行基本操作和监视节点变化。
import org.apache.zookeeper.*;
public class ZookeeperClient {
private static final String ZK_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
private ZooKeeper zooKeeper;
public void connect() throws Exception {
zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("Received event: " + event);
}
});
}
public void close() throws InterruptedException {
if (zooKeeper != null) {
zooKeeper.close();
}
}
public void createNode(String path, String data) throws Exception {
byte[] dataBytes = data.getBytes();
String createdPath = zooKeeper.create(path, dataBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Created node: " + createdPath);
}
public String getNodeData(String path) throws Exception {
byte[] dataBytes = zooKeeper.getData(path, false, null);
return new String(dataBytes);
}
public void setNodeData(String path, String data) throws Exception {
byte[] dataBytes = data.getBytes();
zooKeeper.setData(path, dataBytes, -1);
System.out.println("Set data for node: " + path);
}
public void deleteNode(String path) throws Exception {
zooKeeper.delete(path, -1);
System.out.println("Deleted node: " + path);
}
public void watchNode(String path) throws Exception {
zooKeeper.exists(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("Node changed: " + event.getPath());
// 重新设置监视器
try {
watchNode(event.getPath());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public static void main(String[] args) {
ZookeeperClient client = new ZookeeperClient();
try {
client.connect();
// 创建节点
client.createNode("/example_node", "example_data");
// 获取节点数据
String data = client.getNodeData("/example_node");
System.out.println("Node data: " + data);
// 设置节点数据
client.setNodeData("/example_node", "new_example_data");
// 获取节点数据
data = client.getNodeData("/example_node");
System.out.println("Node data: " + data);
// 监视节点变化
client.watchNode("/example_node");
// 模拟等待节点变化
Thread.sleep(10000);
// 删除节点
client.deleteNode("/example_node");
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
总结
- 添加依赖:在项目中添加 Zookeeper 的依赖。
- 创建客户端:通过
ZooKeeper类创建 Zookeeper 客户端并连接到服务器。 - 基本操作:创建节点、获取节点数据、设置节点数据、删除节点。
- 监视节点变化:使用
Watcher类监视节点的变化。 - 示例代码:通过完整的示例代码展示如何使用 Zookeeper 的 Java API 进行操作。
通过以上方法,可以熟练使用 Zookeeper 的 Java API 进行各种操作,确保其高效稳定地运行。根据实际情况和需求,选择适合你的操作方法并进行实施。