zookeeper分布式锁用法
- package com.example.demo3.zk;
- import lombok.extern.slf4j.Slf4j;
- import org.apache.storm.shade.org.apache.zookeeper.*;
- import java.util.concurrent.CountDownLatch;
- /**
- * Zookeeper 初始化,获取锁,释放锁。创建临时锁。
- */
- @Slf4j
- public class ZooKeeperSession {
- private static CountDownLatch countDownLatch=new CountDownLatch(1);
- private ZooKeeper zooKeeper;
- //目录
- private String lockPath="/orderId-lock-";
- /**
- * 连接zookeeper
- */
- public ZooKeeperSession(){
- try {
- //连接zk服务器
- this.zooKeeper=new ZooKeeper("192.168.132.154:2181,192.168.132.156:2181,192.168.132.155:2181",
- 50000,new ZooKeeperWatcher());
- log.info("状态:"+zooKeeper.getState().toString());
- try {
- countDownLatch.await();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- log.info("ZooKeeper session 建立......");
- }
- /**
- * 获取分布式锁。
- * @param orderId
- */
- public void acquireDistributeLock(Long orderId) {
- String path = lockPath + orderId;
- try {
- zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- log.info("success to acquire lock for order[id=" + orderId + "]");
- } catch (Exception e) {
- e.printStackTrace();
- int count = 0;
- while (true) {
- try {
- Thread.sleep(20);
- zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
- } catch (Exception e1) {
- e1.printStackTrace();
- count++;
- continue;
- }
- log.info("success to acquire lock for order[id=" + orderId + " after " + count + " times try......");
- break;
- }
- }
- }
- /**
- * 释放分布式锁。
- * @param orderId
- */
- public void releaseDistributeLock(Long orderId){
- String path = lockPath+orderId;
- try {
- zooKeeper.delete(path,-1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- } catch (KeeperException e) {
- e.printStackTrace();
- }
- }
- private class ZooKeeperWatcher implements Watcher{
- @Override
- public void process(WatchedEvent event) {
- log.info("Receive watch event:"+event.getState());
- if(Event.KeeperState.SyncConnected == event.getState()){
- countDownLatch.countDown();
- }
- }
- }
- /**
- * 封装单例静态内部类。
- */
- private static class Singleton{
- private static ZooKeeperSession instance;
- static {
- instance=new ZooKeeperSession();
- }
- public static ZooKeeperSession getIntance(){
- return instance;
- }
- }
- /**
- * 获取单例。
- * @return
- */
- public static ZooKeeperSession getInstance(){
- return Singleton.getIntance();
- }
- /**
- * 初始化单例方法。
- */
- public static void init(){
- getInstance();
- }
- }
调用方法:
- package com.example.demo3;
- import com.example.demo3.zk.ZooKeeperSession;
- import lombok.extern.slf4j.Slf4j;
- import org.junit.Test;
- @Slf4j
- public class TestZooKeeper extends Demo3ApplicationTests {
- /**
- * 测试分布式锁。
- */
- @Test
- public void testZookeeper() {
- Long orderId = 1L;
- ZooKeeperSession zooKeeperSession = new ZooKeeperSession();
- log.info("获取锁");
- zooKeeperSession.acquireDistributeLock(orderId);
- log.info("执行业务逻辑...");
- zooKeeperSession.releaseDistributeLock(orderId);
- log.info("释放锁");
- }
- }
运行结果:
源码下载地址:
链接:https://pan.baidu.com/s/1rgyoxf9lLTjDIWX-Ro5o-Q
提取码:ke31
zookeeper分布式锁用法的更多相关文章
- ZooKeeper分布式锁的实现原理
七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...
- Curator实现zookeeper分布式锁的基本原理
一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...
- Zookeeper 分布式锁 (图解+秒懂+史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- Curator Zookeeper分布式锁
Curator Zookeeper分布式锁 pom.xml中添加如下配置 <!-- https://mvnrepository.com/artifact/org.apache.curator/c ...
- ZooKeeper 分布式锁实现
1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...
- ZooKeeper分布式锁浅谈(一)
一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...
- [转载] zookeeper 分布式锁服务
转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...
- 跟着大神学zookeeper分布式锁实现-----来自Ruthless
前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...
- zookeeper分布式锁
摘要:分享牛原创,zookeeper使用,zookeeper锁在实际项目开发中还是很常用的,在这里我们介绍一下zookeeper分布式锁的使用,以及我们如何zookeeper分布式锁的原理.zooke ...
随机推荐
- ubuntu终端代理之proxychains
命令行代理 安装proxychains sudo apt install proxychains 配置proxychains sudo vim /etc/proxychains.conf 在proxy ...
- SQL的“增删改”
结构语言分类 DDL(数据定义语言) create drop alter 创建删除以及修改数据库,表,存储过程,触发器,索引.... DML(数据操作语言) insert delete ...
- java_第一年_JavaWeb(15)
Filter过滤器,Servlet API 中提供了一个Filter接口,用于实现用户在访问某个目标资源前对其进行拦截: 拦截原理:web服务器通过Filter接口调用doFilter方法,会传递一个 ...
- ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板)
ZOJ-1610 线段树+两种查询方法(弥补我线段树区间填充的短板) 题意 题意:给一个n,代表n次操作,接下来每次操作表示把[l,r]区间的线段涂成k的颜色其中,l,r,k的范围都是0到8000 这 ...
- python爬虫相关安装与应用
1.mysql数据库用于存储大量数据. 2.Navicat for MySQL以图形和表格等形式管理数据库工具. 3.编程语言python3与环境配置 4.pythcharm集成开发环境(社区版)不需 ...
- HDU-1269 迷宫城堡(连通分量)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 从ES6重新认识JavaScript设计模式: 装饰器模式
1 什么是装饰器模式 向一个现有的对象添加新的功能,同时又不改变其结构的设计模式被称为装饰器模式(Decorator Pattern),它是作为现有的类的一个包装(Wrapper). 可以将装饰器理解 ...
- SCUT - 142 - 第n个素数
https://scut.online/p/142 但是洲阁筛打表还是超时了,打的表不够长吧,在51nod上面要跑5s.要是快10倍得要密1000倍,根本打不出来(时间意义). 暴力check要找的质 ...
- JEECG 深度使用培训班 周六周日公开课(一期班)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhangdaiscott/article/details/25411023 广大技术爱好者: ...
- Web学习之JS总结
银角大王武Sir的博客地址 银角大王武Sir的博客地址二 1.Javascript的作用域链 由于javascript没有块级作用域,而且每个函数作为一个作用域,如果出现嵌套函数,则就会出现作用域链 ...