使用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…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
[USACO23FEB] Bakery S
题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC,tM≤109)。由于空间…...