java dubbo 分布式锁_基于zookeeper的分布式锁实现

工作中需要写一个定时任务,由于是集群环境,自然而然想到需要通过分布式锁来保证单台执行..相信大家都会想到使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值