java 操作 zookeeper API

/**
 * ZooKeeper Java Api 使用样例<br> 
 *
 * @author <a href="mailto:zhangdongfang@knet.cn">East271536394</a>
 * @version 2013-6-20 下午12:39:41
 */
import java.io.IOException;
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.Ids;
import org.apache.zookeeper.ZooKeeper;

public class JavaApiSample implements Watcher {

	private static final int SESSION_TIMEOUT = 10000;
	private static final String CONNECTION_STRING = "202.173.8.57:4181,202.173.8.58:4181,202.173.8.59:4181";
	private static final String ZK_PATH = "/knet";
	private ZooKeeper zk = null;

	private CountDownLatch connectedSemaphore = new CountDownLatch(1);

	private boolean init = false;

	/** 
	 * 创建ZK连接 
	 * @param connectString  ZK服务器地址列表 
	 * @param sessionTimeout   Session超时时间 
	 */
	public void createConnection(String connectString, int sessionTimeout) {
		this.releaseConnection();
		try {
			zk = new ZooKeeper(connectString, sessionTimeout, this);
			init = true;
			connectedSemaphore.await();
			init = false;
		} catch (InterruptedException e) {
			System.out.println("连接创建失败,发生 InterruptedException");
			e.printStackTrace();
		} catch (IOException e) {
			System.out.println("连接创建失败,发生 IOException");
			e.printStackTrace();
		}
	}

	/** 
	 * 关闭ZK连接 
	 */
	public void releaseConnection() {
		if (this.zk != null) {
			try {
				this.zk.close();
			} catch (InterruptedException e) {
				// ignore 
				e.printStackTrace();
			}
		}
	}

	/** 
	 *  创建节点 
	 * @param path 节点path 
	 * @param data 初始数据内容 
	 * @return 
	 */
	public boolean createPath(String path, String data) {
		try {
			System.out.println("节点创建成功, Path: " + this.zk.create(path, // 
					data.getBytes(), // 
					Ids.OPEN_ACL_UNSAFE, // 
					CreateMode.EPHEMERAL) + ", content: " + data);
		} catch (KeeperException e) {
			System.out.println("节点创建失败,发生KeeperException");
			e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("节点创建失败,发生 InterruptedException");
			e.printStackTrace();
		}
		return true;
	}

	/** 
	 * 读取指定节点数据内容 
	 * @param path 节点path 
	 * @return 
	 */
	public String readData(String path) {
		try {
			System.out.println("获取数据成功,path:" + path);
			return new String(this.zk.getData(path, true, null));
		} catch (KeeperException e) {
			System.out.println("读取数据失败,发生KeeperException,path: " + path);
			e.printStackTrace();
			return "";
		} catch (InterruptedException e) {
			System.out.println("读取数据失败,发生 InterruptedException,path: " + path);
			e.printStackTrace();
			return "";
		}
	}

	/** 
	 * 更新指定节点数据内容 
	 * @param path 节点path 
	 * @param data  数据内容 
	 * @return 
	 */
	public boolean writeData(String path, String data) {
		try {
			System.out.println("更新数据成功,path:" + path + ", stat: " + this.zk.setData(path, data.getBytes(), -1));
		} catch (KeeperException e) {
			System.out.println("更新数据失败,发生KeeperException,path: " + path);
			e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("更新数据失败,发生 InterruptedException,path: " + path);
			e.printStackTrace();
		}
		return false;
	}

	/** 
	 * 删除指定节点 
	 * @param path 节点path 
	 */
	public void deleteNode(String path) {
		try {
			this.zk.delete(path, -1);
			System.out.println("删除节点成功,path:" + path);
		} catch (KeeperException e) {
			System.out.println("删除节点失败,发生KeeperException,path: " + path);
			e.printStackTrace();
		} catch (InterruptedException e) {
			System.out.println("删除节点失败,发生 InterruptedException,path: " + path);
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		JavaApiSample sample = new JavaApiSample();
		sample.createConnection(CONNECTION_STRING, SESSION_TIMEOUT);
		if (sample.createPath(ZK_PATH, "我是节点初始内容")) {
			System.out.println();
			System.out.println("数据内容: " + sample.readData(ZK_PATH) + "\n");
			sample.writeData(ZK_PATH, "更新后的数据");
			System.out.println("数据内容: " + sample.readData(ZK_PATH) + "\n");
			sample.deleteNode(ZK_PATH);
		}
		sample.releaseConnection();
	}

	/** 
	 * 收到来自Server的Watcher通知后的处理。 
	 */
	@Override
	public void process(WatchedEvent event) {
		System.out.println("收到事件通知:" + event.getState() + ",type :" + event.getType() + ",path :" + event.getPath()
				+ "\n");
		if (KeeperState.SyncConnected == event.getState()) {
			if (init) {
				System.out.println("connectedSemaphore.countDown()>>>>>>>>>>>>>>>>");
				connectedSemaphore.countDown();
			}
		}
	}
}



运行结果如下:

收到事件通知:SyncConnected,type :None,path :null

connectedSemaphore.countDown()>>>>>>>>>>>>>>>>
节点创建成功, Path: /knet, content: 我是节点初始内容

获取数据成功,path:/knet
数据内容: 我是节点初始内容

收到事件通知:SyncConnected,type :NodeDataChanged,path :/knet

更新数据成功,path:/knet, stat: 30064771186,30064771187,1371704002257,1371704002267,1,0,0,89895709067640842,18,0,30064771186

获取数据成功,path:/knet
数据内容: 更新后的数据

收到事件通知:SyncConnected,type :NodeDeleted,path :/knet

删除节点成功,path:/knet
2013-06-20 12:53:18,835 [myid:] - INFO  [main:ZooKeeper@679] - Session: 0x13f5fabcdcf000a closed
2013-06-20 12:53:18,835 [myid:] - INFO  [main-EventThread:ClientCnxn$EventThread@511] - EventThread shut down



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值