工作中需要写一个定时任务,由于是集群环境,自然而然想到需要通过分布式锁来保证单台执行..相信大家都会想到使用zk来实现对应的分布式锁.下面就简单介绍一下几种实现
准备工作
有几个帮助类,先把代码放上来
ZKClient 对zk的操作做了一个简单的封装
Java代码
packagezk.lock;
importorg.apache.zookeeper.*;
importorg.apache.zookeeper.data.Stat;
importzk.util.ZKUtil;
importjava.util.concurrent.CountDownLatch;
importjava.util.concurrent.TimeUnit;
/**
* User: zhenghui
* Date: 14-3-26
* Time: 下午8:50
* 封装一个zookeeper实例.
*/
publicclassZKClientimplementsWatcher {
privateZooKeeper zookeeper;
privateCountDownLatch connectedSemaphore =newCountDownLatch(1);
publicZKClient(String connectString,intsessionTimeout)throwsException {
zookeeper =newZooKeeper(connectString, sessionTimeout,this);
System.out.println("connecting zk server");
if(connectedSemaphore.await(10l, TimeUnit.SECONDS)) {
System.out.println("connect zk server success");
}else{
System.out.println("connect zk server error.");
thrownewException("connect zk server error.");
}
}
publicvoidclose()throwsInterruptedException {
if(zookeeper !=null) {
zookeeper.close();
}
}
publicvoidcreatePathIfAbsent(String path,booleanisPersistent)throwsException {
CreateMode createMode = isPersistent ? CreateMode.PERSISTENT : CreateMode.EPHEMERAL;
path = ZKUtil.normalize(path);
if(!this.exists(path)) {
zookeeper.create(path,null, ZooDefs.Ids.OPEN_ACL_UNSAFE, createMode);
}
}
publicbooleanexists(String path)throwsException {
path = ZKUtil.normalize(path);
Stat stat = zookeeper.exists(path,null);
returnstat !=null;
}
publicString getData(String path)throwsException {
path = ZKUtil.normalize(path);
try{
byte[] data = zookeeper.getData(path,null,null);
returnnewString(data);
}catch(KeeperException e) {
if(einstanceofKeeperException.NoNodeException) {
thrownewException("Node does not exist,path is ["+ e.getPath() +"].", e);
}else{
thrownewException(e);
}
}catch