当前位置: 首页 > news >正文

Redisson解锁失败,watchdog会不会一直续期下去?

不用担心这个问题。在解锁过程中,无论解锁失败还是抛出异常,都会停止本地的续期任务,防止后续自动续期。具体实现逻辑如下:

@Override
public void unlock() {try {get(unlockAsync(Thread.currentThread().getId()));} catch (RedisException e) {if (e.getCause() instanceof IllegalMonitorStateException) {throw (IllegalMonitorStateException) e.getCause();} else {throw e;}}
}

这段代码是Redisson解锁方法的入口,会调用unlockAsync方法并传入当前线程ID:

@Override
public RFuture<Void> unlockAsync(long threadId) {return getServiceManager().execute(() -> unlockAsync0(threadId));
}private RFuture<Void> unlockAsync0(long threadId) {CompletionStage<Boolean> future = unlockInnerAsync(threadId);CompletionStage<Void> f = future.handle((opStatus, e) -> {cancelExpirationRenewal(threadId);if (e != null) {if (e instanceof CompletionException) {throw (CompletionException) e;}throw new CompletionException(e);}if (opStatus == null) {IllegalMonitorStateException cause = new IllegalMonitorStateException("attempt to unlock lock, not locked by current thread by node id: "+ id + " thread-id: " + threadId);throw new CompletionException(cause);}return null;});return new CompletableFutureWrapper<>(f);
}

核心逻辑包含两个关键步骤:

  1. 执行解锁操作:unlockInnerAsync(threadId)
  2. 处理解锁结果:通过CompletionStagehandle方法执行后续操作

CompletionStage是Java 8引入的异步编程接口,它的handle方法能够处理操作的成功或失败状态。方法签名如下:

<T> CompletionStage<T> handle(BiFunction<? super T, Throwable, ? extends T> fn);

无论unlockInnerAsync过程中是否成功或出现异常,后续代码都会执行。其中关键部分是:

cancelExpirationRenewal(threadId);

这个方法的实现:

protected void cancelExpirationRenewal(Long threadId) {ExpirationEntry task = EXPIRATION_RENEWAL_MAP.get(getEntryName());if (task == null) {return;}if (threadId != null) {task.removeThreadId(threadId);}if (threadId == null || task.hasNoThreads()) {Timeout timeout = task.getTimeout();if (timeout != null) {timeout.cancel();}EXPIRATION_RENEWAL_MAP.remove(getEntryName());}
}

该方法会从EXPIRATION_RENEWAL_MAP中移除当前线程。由于自动续期依赖于该Map,移除后就不会再续期了。除非从本地Map中移除key的操作也失败,但这种概率极低。

http://www.dtcms.com/a/585975.html

相关文章:

  • 网站建设的单可以刷吗产品网站开发流程
  • 51-基于单片机的多功能油烟机控制系统设计与实现
  • 简述企业网站的建设流程购物网站 功能
  • Git分支上游追踪完全解析:git branch -u与--set-upstream-to用法精讲
  • 【BuildFlow 筑流】Duration.rs 文件实现详解
  • Canal实时同步MySQL数据到Elasticsearch
  • Python 操作 Elasticsearch
  • 微网站建设找哪家公司好中国网站备案取消
  • AI Agent设计模式 Day 3:Self-Ask模式:自我提问驱动的推理链
  • RAG论文阅读笔记
  • 网站建设优化推广修改wordpress数据库域名
  • 西安成品网站建设临沂最新消息
  • 影视网站搭建技术大纲
  • 多粒子模型-简单化学反应1
  • 基于Springboot的影视推荐系统的设计与实现371d749h(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
  • 网站设计与制作说明书应聘网站优化的简历怎么做
  • 网站项目云主机玩游戏怎么样
  • 什么是PMOS?什么是NMOS?两者有什么区别?
  • Selective Kernel Networks (SKNet)
  • Unreal5从入门到精通之 游戏技能系统(Gameplay Ability System)
  • 首钢水钢赛德建设有限公司网站广电如何做视频网站
  • 简洁网站欣赏制作自己的网站代码吗
  • 如何将图片进行压缩-图片压缩格式+压缩方法
  • 桂林临桂区建设局网站seo建站平台哪家好
  • tornado+gunicorn部署设置max_body_size
  • 大鹏网络网站建设报价asp 建站
  • SSM基于Java的医疗器械销售系统oy281(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • CTFHub Web进阶-PHP:Bypass_disable_function通关9之iconv,bypass iconv1,bypass iconv2
  • 排序算法介绍
  • 服装私人订制网站高端网站建设公司名字