使用lambda表达式提取共用代码使其更加简洁
1、在开发预下单接口访问并发问题出现需要加锁代码如下
RLock lock = redissonClient.getLock(String.format(appointmentKey, activityId, studentId));try {boolean tryLock = lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {AppointmentMallOrderInfoDTO appointmentMallOrderInfoDTO =mallOrderInfoRepository.findByActivityId(studentId,activityId);MallOrderInfo mallOrderInfo = MallOrderInfoFactory.createMallOrderInfo(classId, studentId, activityId);mallOrderInfo.appointment(mallActivity, mallProduct);mallOrderInfoRepository.save(mallOrderInfo);if (Objects.nonNull(appointmentMallOrderInfoDTO))mallOrderInfoRepository.deleteById(appointmentMallOrderInfoDTO.getId());}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}
问题说明:加锁是一套固定的写法,在不同地方重复写代码冗余,于是就想着重构。
2、使用抽象类,加抽象方法暴露业务逻辑。
封装类
public abstract class RedissonLockUtils<T> {private String key;private RedissonClient redissonClient;private RedissonLockUtils() {}public RedissonLockUtils(String key) {this.key = key;this.redissonClient = ApplicationContextUtils.getBean(RedissonClient.class);}public abstract <T> T handlerMethod();public <T> T lockMethod() {RLock lock = redissonClient.getLock(key);try {boolean tryLock = lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {return handlerMethod();}} catch (InterruptedException e) {e.printStackTrace();} finally {lock.unlock();}return null;}
}
使用方法

3、因为目前使用的是DDD的方式开发,这种代码不够简洁。业务逻辑不是很清晰。于是想到了使用lambda方式在进行改造
封装类
public class LambdaRedissonLockUtils {private static Logger logger = LoggerFactory.getLogger(LambdaRedissonLockUtils.class);private RedissonClient redissonClient;private RLock lock;public LambdaRedissonLockUtils() {this.redissonClient = ApplicationContextUtils.getBean(RedissonClient.class);}public <P extends String> LambdaRedissonLockUtils key(Supplier<P> keySupplier){lock = redissonClient.getLock(keySupplier.get());return this;}public void noReturnHandlerMethod(NoReturnConsumer consumer) {try {boolean tryLock = lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {consumer.apply();}} catch (InterruptedException e) {e.printStackTrace();logger.error(e.getMessage());} finally {lock.unlock();}}public <T> Optional<T> returnHandlerMethod(ReturnConsumer consumer){try {boolean tryLock = lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {return consumer.apply();}} catch (InterruptedException e) {e.printStackTrace();logger.error(e.getMessage());} finally {lock.unlock();}return Optional.ofNullable(null);}
}
@FunctionalInterface
public interface ReturnConsumer<T> {Optional<T> apply();
}
@FunctionalInterface
public interface NoReturnConsumer {void apply();
}
使用方式
无返回值写法:

有返回值写法:

相关文章:
使用lambda表达式提取共用代码使其更加简洁
1、在开发预下单接口访问并发问题出现需要加锁代码如下 RLock lock redissonClient.getLock(String.format(appointmentKey, activityId, studentId));try {boolean tryLock lock.tryLock(10, 20, TimeUnit.SECONDS);if (tryLock) {AppointmentMallOrderInfoDTO appointmentM…...
【八股】2023秋招八股复习笔记3(智力题 非技术题50道)
文章目录 1、智力题赛⻢问题烧绳⼦问题找出最重球问题药丸问题有两个杯⼦,囚犯问题⽣孩⼦问题赢汽⻋问题卡牌问题拿硬币问题量⽔问题聚会问题数字游戏问题艾滋病问题找出变质药问题毒药问题分盐问题弹球问题病狗问题⽕⻋运煤问题分苹果问题分⾦条问题搬⾹蕉问题舀酒…...
服务器卡顿如何排查?
服务器网络卡,一般情况下,请先检查您服务器的使用情况。 1.CPU使用率是否大于50%。 2.网络使用率是否过高。 3.内存使用率是否过高。 如果出现上述情况,则表明您的服务器或网络无法承载您目前的服务,请联系技术人员调整您的资…...
设计模式——开闭原则
文章目录 基本介绍看下面一段代码方式 1 的优缺点改进的思路分析 基本介绍 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方)。用抽…...
服务器能运行什么应用
服务器能运行什么应用 服务器是一种应用范围很广的网络技术产品,它在影视、视频以及医疗和金融等多个领域,都可以发挥使用价值,那么服务器能运行什么应用?大家跟着壹基比小鑫一起来了解吧! 服务器的作用是什么? 服…...
Linux TCP协议
传输层的协议主要有三个:TCP协议(可靠)、UDP协议(不可靠)和SCPT协议(不可靠)。 一、TCP协议的概念 TCP协议也称传输控制协议,是一种可靠的、面向连接的、基于字节流的传输层通信协…...
pytorch 入门1-tensor 广播 view reshape
tensor 的四则运算broadcast import torch import numpy as np # 张量tensor 随机初始化 x torch.rand(4,3) print(x) y torch.randn(4,3) print(y)# 初始化全零 张量 a torch.zeros((4,4),dtypetorch.long) print(a) #初始化全一 张量 b torch.ones(4,4) print(b) c tor…...
Spring参数注解,支持数组入参(List)校验
Spring参数注解,支持数组入参(List)校验 1、controller类增加Validated注解,对应的数组参数增加Valid注解。 Validated RestController RequestMapping("/parent") public class ParentController {private FatherRepos…...
如何使用ArcGIS进行可视化分析
概述 通视分析是指以某一点为观察点,研究某一区域通视情况的地形分析,利用DEM判断地形上任意两点之间是否可以互相可见的技术方法,分为视线通视分析和视域通视分析,前者判断任意两点之间能否通视,后者从任一点出发&am…...
计算机竞赛 基于LSTM的天气预测 - 时间序列预测
0 前言 🔥 优质竞赛项目系列,今天要分享的是 机器学习大数据分析项目 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/po…...
uniapp 回退到指定页面 保存页面状态
uniapp 历史页面回退到指定页面。 getCurrentPages() 内容如下 let delta getCurrentPages().reverse().findIndex(item > item.route "pages/popularScience/daodi") if(delta-1){uni.navigateTo({url: /pages/popularScience/daodi,success: res > {},fa…...
ansible(1)-- 部署ansible连接被控端
目录 一、部署ansible 1.1 安装 1.2 测试连接 192.168.136.55 ansible 192.168.136.56被控端 一、部署ansible 1.1 安装 zabbix-s只是主机名,不用在意,更好该主机也安装了zabbix,不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…...
Log4j反序列化命令执行漏洞(CVE-2017-5645)Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)
一.Log4j反序列化命令执行漏洞(CVE-2017-5645) Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码 环境:vulhub 工具下载地址࿱…...
echarts 之 科技感进度条
1.图片展示 2.代码实现 /* ng qty 进度条 */ <template><div class"ngqty-progress"><div class"ngqty-info"><span>X4</span><span>50%</span></div><div :id"barNgQtyProgress index" c…...
基于gin关于多级菜单的处理
多级菜单是很多业务场景需要的。下面是一种处理方式 // 生成树结构 func tree(menus []*video.XkVideoCategory, parentId uint) []*video.XkVideoCategory {//定义子节点目录var nodes []*video.XkVideoCategoryif reflect.ValueOf(menus).IsValid() {//循环所有一级菜单for …...
Oracle/PL/SQL奇技淫巧之Lable标签与循环控制
在一些存储过程场景中,可能存在需要在满足某些条件时跳出循环的场景, 但是在PL/SQL中,不能使用break语句直接跳出循环, 但是可以通过lable标签的方式跳出循环,例: <<outer_loop>> FOR i IN 1..5 LOOPDBMS…...
Docker基础操作
1.安装docker服务,配置镜像加速器 安装docker服务 清理缓存 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-enginesystemctl enable --now docker 脚…...
AMBA总线协议(8)——AHB(六):分割传输
一、前言 在之前的文章中,我们重点介绍了AHB传输的仲裁,首先介绍了仲裁相关的信号,然后分别介绍了请求总线访问,授权总线访问,猝发提前终止,锁定传输和默认主机总线,在本文中我们将继续介绍AHB的…...
时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化
时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SWD群体分解的分量可视化,基于群体分解的信号分解技术,MATLAB程序…...
【makefile】自动化变量的简述及实例
文章目录 10. env20. 简述百度百科常用的自动化变量 30. 实例90. 附件下载 10. env ubuntu1804 GNU Make 4.120. 简述 百度百科 https://baike.baidu.com/item/Makefile/4619787?frge_ala makefile 文件的格式: 目标:依赖命令软件编译的流程概述&am…...
STM32 USART串口调试避坑指南:从波特率配置到数据帧异常排查
STM32 USART串口调试避坑指南:从波特率配置到数据帧异常排查 在嵌入式开发中,USART串口通信是最基础却又最容易出问题的环节之一。许多开发者都曾经历过这样的场景:代码编译通过,硬件连接无误,但串口就是无法正常通信&…...
MinerU效果展示:精准识别表格数据,财务报告一键解析
MinerU效果展示:精准识别表格数据,财务报告一键解析 1. 引言:当AI遇见财务报表 想象一下,你是一名财务分析师,面前堆着几十份上市公司最新发布的PDF财报。你需要从中快速提取近三年的营收、利润、现金流等关键数据&a…...
KindEditor富文本编辑器:轻量级网页内容创作解决方案
KindEditor富文本编辑器:轻量级网页内容创作解决方案 【免费下载链接】kindeditor WYSIWYG HTML editor 项目地址: https://gitcode.com/gh_mirrors/ki/kindeditor 在当今Web开发中,内容编辑功能是许多网站的核心需求,但开发者常常面临…...
导师推荐!盘点2026年最受欢迎的AI论文工具
一天写完毕业论文在2026年已不再是天方夜谭。2026年AI论文工具全面升级,实测提速超50%,覆盖选题、文献分析、内容生成、降重润色、格式排版等全流程场景,真正帮你高效搞定论文。 一、全流程王者:一站式搞定论文全链路(…...
Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析
Z-Image-Turbo-rinaiqiao-huiyewunv 复杂场景生成挑战赛获奖作品赏析 最近,我花了不少时间研究社区里的一场AI图像生成挑战赛,主题是“复杂场景生成”。参赛者们用的是一个叫Z-Image-Turbo-rinaiqiao-huiyewunv的模型,名字有点长,…...
机器视觉中的坐标系转换:从像素到世界的无缝衔接
1. 机器视觉中的坐标系基础概念 第一次接触机器视觉时,最让我困惑的就是各种坐标系之间的关系。记得当时调试工业相机时,明明在图像上看到了目标物体,但机械臂就是抓不准位置。后来才发现,问题出在没有正确理解像素坐标系和世界坐…...
保姆级避坑指南:用Python预测波士顿房价,你的MSE为什么降不下来?
Python实战:波士顿房价预测模型MSE居高不下的7个关键排查点 当你第一次尝试用线性回归预测波士顿房价时,最令人沮丧的莫过于看着训练损失曲线反复横跳,而测试集的MSE(均方误差)却像被钉在墙上的蝴蝶标本一样纹丝不动。…...
OpenRocket:重新定义模型火箭设计与仿真的开源力量
OpenRocket:重新定义模型火箭设计与仿真的开源力量 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 核心价值:破解模型火箭开发的效…...
如何用TrollInstallerX在iOS 14-16设备上安装TrollStore
如何用TrollInstallerX在iOS 14-16设备上安装TrollStore 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX TrollInstallerX是一款专为iOS 14.0-16.6.1系统设计的TrollStor…...
从单点到高可用:在Ubuntu 22.04上一步步将HBase 2.x升级为HA架构(含故障切换测试)
从单点到高可用:在Ubuntu 22.04上实现HBase 2.x高可用架构实战指南 当你的数据服务从测试环境走向生产环境,单点故障就成了悬在头顶的达摩克利斯之剑。想象一下凌晨三点被报警电话惊醒,只是因为唯一的HMaster节点宕机导致整个数据服务不可用—…...
