zookeeper分布式配置管理

来源:互联网 发布:mysql 替换 编辑:程序博客网 时间:2024/05/17 06:05

配置中心代码:

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 ConfigCenter implements Watcher

public class ZooKeeperWatcher implements Watcher ,Runnable {
 
 private ZooKeeper zooKeeper = null;
 private String znode;

 public ZooKeeper getZooKeeper() {
  return this.zooKeeper;
 }

//zw1.connect("127.0.0.1", "/root1");

 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");
 }
}

 

0 0
原创粉丝点击