配置中心代码:
package test2;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class ConfigCenter implements Watcher {
ZooKeeper zk = null;
String znode;
ConfigCenter(String address, String znode) {
this.znode = znode;
try {
this.zk = new ZooKeeper(address, 3000, this);
Stat st = this.zk.exists("/root1", true);
if (st == null) {
this.zk.create(znode, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
} catch (IOException e) {
e.printStackTrace();
this.zk = null;
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void process(WatchedEvent event) {
System.out.println(event.toString());
try {
this.zk.exists("/root1", true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
void updateConfig(String str) {
try {
Stat s = this.zk.exists(this.znode, true);
this.zk.setData(this.znode, str.getBytes(), s.getVersion());
} catch (Exception e) {
e.printStackTrace();
}
}
}
监听客户端代码:
package test2;
import java.io.IOException;
import java.io.PrintStream;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.ZooKeeper;
public class ZooKeeperWatcher implements Watcher ,Runnable {
private ZooKeeper zooKeeper = null;
private String znode;
public ZooKeeper getZooKeeper() {
return this.zooKeeper;
}
public void connect(String hosts, String znode) throws IOException,
InterruptedException, KeeperException {
this.zooKeeper = new ZooKeeper(hosts, 2000, this);
this.znode = znode;
this.zooKeeper.exists(znode, true);
}
public void setData(byte[] data) {
try {
Stat s = this.zooKeeper.exists(znode, false);
this.zooKeeper.setData(znode, data, s.getVersion());
} catch (Exception e) {
e.printStackTrace();
}
}
public void process(WatchedEvent event) {
System.out.println(event.toString());
try {
this.zooKeeper.exists(znode, true);//不知道为什么一定要加上这句话,下次事件到来时,才会触发process事件
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void run() {
try {
synchronized (this) {
while (true) {
wait();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
测试代码:
package test2;
import java.io.IOException;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
public class test {
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
ZooKeeperWatcher zw1 = new ZooKeeperWatcher();
zw1.connect("127.0.0.1", "/root1");
ZooKeeperWatcher zw2 = new ZooKeeperWatcher();
zw2.connect("127.0.0.1", "/root1");
new Thread(zw1).start();
new Thread(zw2).start();
ConfigCenter cc = new ConfigCenter("127.0.0.1","/root1");
cc.updateConfig("a");
cc.updateConfig("b");
cc.updateConfig("c");
cc.updateConfig("d");
}
}