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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端