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

使用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、智力题赛⻢问题烧绳⼦问题找出最重球问题药丸问题有两个杯⼦&#xff0c;囚犯问题⽣孩⼦问题赢汽⻋问题卡牌问题拿硬币问题量⽔问题聚会问题数字游戏问题艾滋病问题找出变质药问题毒药问题分盐问题弹球问题病狗问题⽕⻋运煤问题分苹果问题分⾦条问题搬⾹蕉问题舀酒…...

服务器卡顿如何排查?

服务器网络卡&#xff0c;一般情况下&#xff0c;请先检查您服务器的使用情况。 1.CPU使用率是否大于50%。 2.网络使用率是否过高。 3.内存使用率是否过高。 如果出现上述情况&#xff0c;则表明您的服务器或网络无法承载您目前的服务&#xff0c;请联系技术人员调整您的资…...

设计模式——开闭原则

文章目录 基本介绍看下面一段代码方式 1 的优缺点改进的思路分析 基本介绍 开闭原则&#xff08;Open Closed Principle&#xff09;是编程中最基础、最重要的设计原则 一个软件实体如类&#xff0c;模块和函数应该对扩展开放(对提供方)&#xff0c;对修改关闭(对使用方)。用抽…...

服务器能运行什么应用

服务器能运行什么应用 服务器是一种应用范围很广的网络技术产品&#xff0c;它在影视、视频以及医疗和金融等多个领域&#xff0c;都可以发挥使用价值&#xff0c;那么服务器能运行什么应用?大家跟着壹基比小鑫一起来了解吧&#xff01; 服务器的作用是什么&#xff1f; 服…...

Linux TCP协议

传输层的协议主要有三个&#xff1a;TCP协议&#xff08;可靠&#xff09;、UDP协议&#xff08;不可靠&#xff09;和SCPT协议&#xff08;不可靠&#xff09;。 一、TCP协议的概念 TCP协议也称传输控制协议&#xff0c;是一种可靠的、面向连接的、基于字节流的传输层通信协…...

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参数注解&#xff0c;支持数组入参&#xff08;List&#xff09;校验 1、controller类增加Validated注解&#xff0c;对应的数组参数增加Valid注解。 Validated RestController RequestMapping("/parent") public class ParentController {private FatherRepos…...

如何使用ArcGIS进行可视化分析

概述 通视分析是指以某一点为观察点&#xff0c;研究某一区域通视情况的地形分析&#xff0c;利用DEM判断地形上任意两点之间是否可以互相可见的技术方法&#xff0c;分为视线通视分析和视域通视分析&#xff0c;前者判断任意两点之间能否通视&#xff0c;后者从任一点出发&am…...

计算机竞赛 基于LSTM的天气预测 - 时间序列预测

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 机器学习大数据分析项目 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; 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只是主机名&#xff0c;不用在意&#xff0c;更好该主机也安装了zabbix&#xff0c;不好更改。 下载阿里云epel源 #安装阿里云的epel源&#…...

Log4j反序列化命令执行漏洞(CVE-2017-5645)Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

一.Log4j反序列化命令执行漏洞(CVE-2017-5645&#xff09; Apache Log4j是一个用于Java的日志记录库&#xff0c;其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码 环境&#xff1a;vulhub 工具下载地址&#xff1…...

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标签与循环控制

在一些存储过程场景中&#xff0c;可能存在需要在满足某些条件时跳出循环的场景&#xff0c; 但是在PL/SQL中&#xff0c;不能使用break语句直接跳出循环, 但是可以通过lable标签的方式跳出循环&#xff0c;例&#xff1a; <<outer_loop>> FOR i IN 1..5 LOOPDBMS…...

Docker基础操作

1.安装docker服务&#xff0c;配置镜像加速器 安装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(六):分割传输

一、前言 在之前的文章中&#xff0c;我们重点介绍了AHB传输的仲裁&#xff0c;首先介绍了仲裁相关的信号&#xff0c;然后分别介绍了请求总线访问&#xff0c;授权总线访问&#xff0c;猝发提前终止&#xff0c;锁定传输和默认主机总线&#xff0c;在本文中我们将继续介绍AHB的…...

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化

时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化 目录 时序分解 | MATLAB实现基于SWD群体分解的信号分解分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于SWD群体分解的分量可视化&#xff0c;基于群体分解的信号分解技术&#xff0c;MATLAB程序…...

【makefile】自动化变量的简述及实例

文章目录 10. env20. 简述百度百科常用的自动化变量 30. 实例90. 附件下载 10. env ubuntu1804 GNU Make 4.120. 简述 百度百科 https://baike.baidu.com/item/Makefile/4619787?frge_ala makefile 文件的格式&#xff1a; 目标&#xff1a;依赖命令软件编译的流程概述&am…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...