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分布式锁用法的更多相关文章

  1. ZooKeeper分布式锁的实现原理

    七张图彻底讲清楚ZooKeeper分布式锁的实现原理[石杉的架构笔记] 文章转载自:https://juejin.im/post/5c01532ef265da61362232ed#comment(写的 ...

  2. Curator实现zookeeper分布式锁的基本原理

    一.写在前面 之前写过一篇文章(<拜托,面试请不要再问我Redis分布式锁的实现原理>),给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的,这篇文章再给大家聊一 ...

  3. Zookeeper 分布式锁 (图解+秒懂+史上最全)

    文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...

  4. Curator Zookeeper分布式锁

    Curator Zookeeper分布式锁 pom.xml中添加如下配置 <!-- https://mvnrepository.com/artifact/org.apache.curator/c ...

  5. ZooKeeper 分布式锁实现

    1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...

  6. ZooKeeper分布式锁浅谈(一)

    一.概述 清明节的时候写了一篇分布式锁概述,里面介绍了分布式锁实现的几种方式,其实那时候我一直沉迷于使用redis的悲观锁和乐观锁来实现分布式锁,直到一个血案的引发才让我重新认识了redis分布式锁的 ...

  7. [转载] zookeeper 分布式锁服务

    转载自http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html 分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那 ...

  8. 跟着大神学zookeeper分布式锁实现-----来自Ruthless

    前几天分享了@Ruthless大神的Redis锁,发现和大家都学习了很多东西.因为分布式锁里面,最好的实现是zookeeper的分布式锁.所以在这里把实现方式和大家分享一下. zookeeper分布式 ...

  9. zookeeper分布式锁

    摘要:分享牛原创,zookeeper使用,zookeeper锁在实际项目开发中还是很常用的,在这里我们介绍一下zookeeper分布式锁的使用,以及我们如何zookeeper分布式锁的原理.zooke ...

随机推荐

  1. C/C++ 引入头文件时 #include<***.h> 与 #include"***.h" 区别

    两种情况区分: 1.#include <> 编译器只会去系统文件目录中查找,找不到就报错. 2.#include " "  编译器会先在用户目录中查找,再到编译器设定的 ...

  2. STM32 debug setting 闪退

    闪退user文件夹里旧版本文件  有个同名的  uvprojt类型的文件删了即可

  3. Django之视图(V)

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  4. 高性能和可扩展的React-Redux

    注意:文章很长,只想了解逻辑而不深入的,可以直接跳到总结部分. 初识 首先,从它暴露对外的API开始 ReactReduxContext /* 提供了 React.createContext(null ...

  5. 多个nginx之间如何实现反向代理和负责均衡

    1)nginx反向代理: http {     upstream routeadmin {         ip_hash;         server 127.0.0.1:9201 weight= ...

  6. MVC的view页面内嵌C#语法发现路径被转码的解决方法

    一,上视图代码,如下 console.log('@urlquery.ToString()'); console.log('@Html.Raw(urlquery.ToString())'); 二,显示结 ...

  7. MySQL的一些指令操作

    这个连接的也不错: https://www.cnblogs.com/wangyueping/p/11258028.html 如何给MySQL数据可添加一个用户 首先以root身份登录到MySQL服务器 ...

  8. Ionic -v1初始项目结构

    界面  

  9. socket中TCP的三次握手连接和四次握手释放

    三次握手连接 A: 我进来了啊 B:(有人来了安排个位子)回复:好的你进来吧 A:好的: 客户端向服务器发送一个SYN J 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1 客户 ...

  10. linux下挂载U盘方法

    1.使用 cat /proc/partitions 查看系统现在有哪些分区:[root@localhost ~]# cat /proc/partitions major minor  #blocks  ...