ZooKeeper分布式锁

maven配置

<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-framework</artifactId>
	<version>2.8.0</version>
</dependency>
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-recipes</artifactId>
	<version>2.8.0</version>
</dependency>

Curator框架是最好用,最流行的zookeeper的客户端。

它有以下三个优点

1.提供了一套非常友好的操作API;

2. 提供一些高级特性(包括但不仅限于前篇文章中提到的)的封装

3.易测试

第一种 创建client 。一路点到底,这就是所谓的Fluent风格。 可以设置更多的属性。

CuratorFramework client = builder.connectString("192.168.11.56:2180")
		.sessionTimeoutMs(30000)
		.connectionTimeoutMs(30000)
		.canBeReadOnly(false)
		.retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE))
		.namespace(namespace)
		.defaultData(null)
		.build();
client.start();
第二种
1. 使用CuratorFrameworkFactory工厂的两个静态方法创建客户端 

a) static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs,RetryPolicy retryPolicy)

b) static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy) 

		private static final String ZK_ADDRESS = "127.0.0.1:2181";
		public void init(){
			// 1.Connect to zk
			CuratorFramework client = CuratorFrameworkFactory.newClient(
					ZK_ADDRESS,
					new RetryNTimes(10, 5000)
			);
			client.start();
		}

分布式锁工具类

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;

@Component
public class ZookeeperLockUtil{

	private CuratorFramework client = null;
	private static final String ZK_ADDRESS = "127.0.0.1:2181";
	private static final String ZK_LOCK_PATH = "/zktest";

	@PostConstruct
	public void init(){
		// 1.Connect to zk
		client = CuratorFrameworkFactory.newClient(
				ZK_ADDRESS,
				new RetryNTimes(10, 5000)
		);
		client.start();
	}


	public InterProcessMutex createPath(String number){
		try {
			InterProcessMutex lock = new InterProcessMutex(client, ZK_LOCK_PATH.concat("/").concat(number));
			return lock;
		} catch (Exception e) {
			return null;
		}
	}


	public boolean lockAcquired(InterProcessMutex lock){
		try {
			if(lock.acquire(10 * 1000, TimeUnit.SECONDS)){
				return true;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	public void lockRelease(InterProcessMutex lock, String number){
		try {
			if(null != lock){
				lock.release();
				StringBuilder nodePath = new StringBuilder();
				nodePath.append(ZK_LOCK_PATH).append("/").append(number);
				if(null != client && null != client.checkExists().forPath(nodePath.toString())){
					client.delete().forPath(nodePath.toString());
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值