1 package com.karat.cn.zookeeper.javaApi;
2
3 import java.io.IOException;
4 import java.util.List;
5 import java.util.concurrent.CountDownLatch;
6 import java.util.concurrent.TimeUnit;
7
8 import org.apache.zookeeper.CreateMode;
9 import org.apache.zookeeper.KeeperException;
10 import org.apache.zookeeper.WatchedEvent;
11 import org.apache.zookeeper.Watcher;
12 import org.apache.zookeeper.ZooDefs;
13 import org.apache.zookeeper.ZooKeeper;
14 import org.apache.zookeeper.data.Stat;
15
16 /**
17 * java的api对节点的操作
18 * @author 开发
19 *
20 */
21 public class CreateDodeDemo implements Watcher{
22
23 private final static String CONNECTSTRING="47.107.121.215:2181";
24
25 private static CountDownLatch countDownLatch=new CountDownLatch(1);
26
27 private static ZooKeeper zooKeeper;
28
29 private static Stat stat=new Stat();
30
31 public static void main(String []args) throws IOException, InterruptedException, KeeperException{
32 /*zooKeeper=new ZooKeeper(CONNECTSTRING, 5000,new Watcher() {
33 @Override
34 public void process(WatchedEvent event) {
35 //如果当前的连接状态是连接成功的,那么通过计数器去控制
36 if(event.getState()==Event.KeeperState.SyncConnected){
37 if(Event.EventType.None==event.getType()&&null==event.getPath()){
38 countDownLatch.countDown();
39 System.out.println(event.getState()+"->"+event.getType());
40 }else if(event.getType()== Event.EventType.NodeDataChanged){//数据变更触发路径
41 try {
42 System.out.println("数据变更触发路径:"+event.getPath()+"->改变后的值:"+
43 zooKeeper.getData(event.getPath(),true,stat));
44 } catch (KeeperException e) {
45 e.printStackTrace();
46 } catch (InterruptedException e) {
47 e.printStackTrace();
48 }
49 }else if(event.getType()== Event.EventType.NodeChildrenChanged){//子节点的数据变化会触发
50 try {
51 System.out.println("子节点数据变更路径:"+event.getPath()+"->节点的值:"+
52 zooKeeper.getData(event.getPath(),true,stat));
53 } catch (KeeperException e) {
54 e.printStackTrace();
55 } catch (InterruptedException e) {
56 e.printStackTrace();
57 }
58 }else if(event.getType()== Event.EventType.NodeCreated){//创建子节点的时候会触发
59 try {
60 System.out.println("节点创建路径:"+event.getPath()+"->节点的值:"+
61 zooKeeper.getData(event.getPath(),true,stat));
62 } catch (KeeperException e) {
63 e.printStackTrace();
64 } catch (InterruptedException e) {
65 e.printStackTrace();
66 }
67 }else if(event.getType()== Event.EventType.NodeDeleted){//子节点删除会触发
68 System.out.println("节点删除路径:"+event.getPath());
69 }
70 System.out.println(event.getType());
71 }
72 }
73 });*/
74 zooKeeper=new ZooKeeper(CONNECTSTRING, 5000,new CreateDodeDemo());//上面代码改成这一行代码
75
76
77 countDownLatch.await();
78 System.out.println(zooKeeper.getState());
79
80 //连接成功创建节点
81 String result=zooKeeper.create("/app","app节点创建".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
82 //注册
83 zooKeeper.getData("/app", true, stat);
84 System.out.println("创建成功->"+result);
85 //修改数据
86 zooKeeper.setData("/app", "修改第一次".getBytes(),-1);
87 //睡眠2秒
88 Thread.sleep(2000);
89 //修改数据
90 zooKeeper.setData("/app", "修改第二次".getBytes(),-1);
91 //睡眠2秒
92 Thread.sleep(2000);
93 //删除
94 //zooKeeper.delete("/app", -1);
95 //睡眠2秒
96 //Thread.sleep(2000);
97 //创建节点和子节点(临时节点下不能挂子节点)
98 String path="/node";
99
100 zooKeeper.create(path, "节点node".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
101 TimeUnit.SECONDS.sleep(1);
102
103 Stat stat=zooKeeper.exists(path+"/app",true);
104 if(stat==null){//表示节点不存在
105 zooKeeper.create(path+"/app","node子节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
106 TimeUnit.SECONDS.sleep(1);
107 }
108 //修改子路径
109 zooKeeper.setData(path+"/app","修改后的".getBytes(),-1);
110 TimeUnit.SECONDS.sleep(1);
111
112 //获取指定节点下的子节点
113 List<String> list=zooKeeper.getChildren("/node", true);//第二个参数表示获取是否监控
114 System.out.println(list);
115
116
117 }
118
119
120 /**
121 * 实现接口Watcher中的process抽象方法
122 */
123 public void process(WatchedEvent watchedEvent) {
124 //如果当前的连接状态是连接成功的,那么通过计数器去控制
125 if(watchedEvent.getState()==Event.KeeperState.SyncConnected){
126 if(Event.EventType.None==watchedEvent.getType()&&null==watchedEvent.getPath()){
127 countDownLatch.countDown();
128 System.out.println(watchedEvent.getState()+"-->"+watchedEvent.getType());
129 }else if(watchedEvent.getType()== Event.EventType.NodeDataChanged){
130 try {
131 System.out.println("数据变更触发路径:"+watchedEvent.getPath()+"->改变后的值:"+
132 zooKeeper.getData(watchedEvent.getPath(),true,stat));
133 } catch (KeeperException e) {
134 e.printStackTrace();
135 } catch (InterruptedException e) {
136 e.printStackTrace();
137 }
138 }else if(watchedEvent.getType()== Event.EventType.NodeChildrenChanged){//子节点的数据变化会触发
139 try {
140 System.out.println("子节点数据变更路径:"+watchedEvent.getPath()+"->节点的值:"+
141 zooKeeper.getData(watchedEvent.getPath(),true,stat));
142 } catch (KeeperException e) {
143 e.printStackTrace();
144 } catch (InterruptedException e) {
145 e.printStackTrace();
146 }
147 }else if(watchedEvent.getType()== Event.EventType.NodeCreated){//创建子节点的时候会触发
148 try {
149 System.out.println("节点创建路径:"+watchedEvent.getPath()+"->节点的值:"+
150 zooKeeper.getData(watchedEvent.getPath(),true,stat));
151 } catch (KeeperException e) {
152 e.printStackTrace();
153 } catch (InterruptedException e) {
154 e.printStackTrace();
155 }
156 }else if(watchedEvent.getType()== Event.EventType.NodeDeleted){//子节点删除会触发
157 System.out.println("节点删除路径:"+watchedEvent.getPath());
158 }
159 System.out.println(watchedEvent.getType());
160 }
161
162 }
163 }