使用lambda表达式提取共用代码使其更加简洁

news2025/1/11 21:03:18

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();
}

使用方式
无返回值写法:
在这里插入图片描述

有返回值写法:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【修改MAC地址工具】-TMAC

本文介绍修改MAC地址的神器小工具Technitium-MAC-Address-Changer 1. 下载地址 地址1&#xff1a; https://technitium.com/tmac/ 地址2&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-jtwQ936gtepVWXKo_qwfg 提取码&#xff1a;2n1s 2. 安装 直接双击就可以安装…

iTwinCapture中文版原ContextCapture安装包以及安装教程

iTwinCapture软件安装教程 一、获取软件 中文安装包评论区或后台回复iTwinCapture 在App Store或Google Play搜索软件名称"iTwin Capture",下载安装软件。 您也可以在Bentley官网下载对应的iTwin Capture版本。 二、软件安装 点击下载后的安装包,根据提示完成安装…

NR SDAP

在NR系统的核心网中,业务不再以EPS承载的形式下发到接入网,而是以QoS flow的形式下发到接入网。在核心网引入QoS flow之后,可以提供比EPS承载更好的QoS粒度,从而更好地对IP数据流进行管理。一个QoS flow由一个或多干IP data stream聚合而成。因此,在核心网中,IP flow映射…

git 统计(命令)

查询某人某个时刻提交了多少代码 added 添加代码 removed 删除代码 total 总代码 git log --author刘俊秦 --since2023-08-01 00:00:00 --until2023-08-23 23:00:00 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf "added lines: %s…

JW0818近电报警芯片

JW0818 市电感应报警电路适用于电业人员和电信行业施工人员的安全保护用品–近电预警器 报警电路。 特别注意芯片引脚6&#xff0c;输出信号是方波&#xff0c;而不是高低电平&#xff1b;在产品开发过程遇到这个坑。

C++中的抽象类和接口

面向对象中的抽象概念 在进行面向对象分析时&#xff0c;会发现一些抽象的概念&#xff01; 图形的面积如何计算&#xff1f; 什么是抽象类&#xff1f; 在现实中需要知道具体的图像类型才能求面积&#xff0c;所以对概念上的 "图形" 求面积是没有意义的&#xff…

私有化部署即时通讯平台,30分钟替换钉钉和企业微信

随着企业对即时通讯和协作工具的需求不断增长&#xff0c;私有化部署的即时通讯平台成为企业的首选。WorkPlus作为有10余年行业深耕经验与技术沉淀品牌&#xff0c;以其安全高效的私有化部署即时通讯解决方案&#xff0c;帮助企业在30分钟内替换钉钉和企业微信。本文将深入探讨…

基于Jenkins自动打包并部署docker、PHP环境,ansible部署-------从小白到大神之路之学习运维第86天

第四阶段提升 时 间&#xff1a;2023年8月23日 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins部署docker、PHP环境 目录 一、环境部署 &#xff08;一&#xff09;实验环境&#xff0c;服务器设置 &#xff08;二&#xff09;所有主机关闭防火墙和selinu…

Docker容器与虚拟化技术:Gitlab账户注册

目录 一、实验 1.gitlab 一、实验 1.gitlab (1) 概念 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务。 &#xff08;2&#xff09;官网 The DevSecOps Platform | GitLab &#xff08;3&#…

nginx 一个端口配置前后端分离项目访问

nginx 一个端口配置前后端分离项目访问 nginx配置 server {listen 8888;server_name _;location ~ .*\.(gif|jpg|jpeg|png|pdf|txt|zip|rar|7z|doc|docx|xls|xlsx|ppt|pptx|mp3|mp4)$ {root D:/platform/tomcat/apache-tomcat-9.0.31/webapps/resources;}location /api/…

智慧灌区闸控一体化解决方案

智慧灌区闸控一体化解决方案是指将灌溉系统中的闸门控制与水文监测、远程通信和数据管理等功能相集成&#xff0c;实现对灌区水资源的智能化管理和控制的方案。以下是智慧灌区闸控一体化解决方案的主要组成部分&#xff1a; ■闸门控制系统&#xff1a;包括闸门、闸门执行器和控…

计算机视觉入门 4)滑动窗口

系列文章目录 计算机视觉入门 1&#xff09;卷积分类器计算机视觉入门 2&#xff09;卷积和ReLU计算机视觉入门 3&#xff09;最大池化计算机视觉入门 4&#xff09;滑动窗口计算机视觉入门 5&#xff09;自定义卷积网络计算机视觉入门 6&#xff09; 数据集增强&#xff08;D…

WoShop跨境电商系统开发:打造全球畅销产品

随着全球贸易的发展&#xff0c;跨境电商成为了许多企业拓展市场、增加盈利的重要途径。而要在跨境电商领域取得成功&#xff0c;开发一个高效、稳定的跨境电商系统是至关重要的。本文将为您详细介绍跨境电商系统开发&#xff0c;以及打造全球畅销产品的关键要素和方法。 一、…

H5页面跳转到公众号关注页面

效果展示&#xff1a; 未关注展示关注&#xff1b;已关注展示发消息 实现步骤&#xff1a; 登录微信公众平台 &#xff1a; https://mp.weixin.qq.com/鼠标右键选择查看网页源代码&#xff0c;找到uin_base64值如果没有uin_base64&#xff0c;那就找到uin进行base64编码编码地…

在使用springer模板的时候,引用书 book时候,末尾的引文地方出现问号???

文章目录 背景解决办法 背景 其实springer有很多模板的&#xff0c;比如nature系列有一个模板&#xff0c;计算机系列有一个模板&#xff0c;计算机系列的模板引用参考文献时好像不会出现标题的问题&#xff0c;我是使用nature系列模板出现这个问题的&#xff0c;如下&#xf…

Linux网络服务 七:iptables防火墙工具

文章目录 1.防火墙简介1.1 什么是防火墙1.2 Netfilter1.3 firewalld和iptables 2. iptables工具简述2.1 iptables的定义2.2 三种报文流向2.3iptables的表和链2.3.1**四表** ----规则表2.3.2**五链** ----规则链 3.iptables配置及操做3.1 基本语法3.1.1 控制类型项 (要大写!!!)3…

AR地图微信小程序:数字化时代下地图应用的新突破

随着数字化时代的到来&#xff0c;地图应用成为人们日常生活中不可或缺的工具。而随着增强现实&#xff08;AR&#xff09;技术的快速发展&#xff0c;AR地图微信小程序应运而生&#xff0c;为用户提供了一种全新的地图导航体验。本文将深入探讨AR地图微信小程序的专业性和思考…

LoRA继任者ReLoRA登场,通过叠加多个低秩更新矩阵实现更高效大模型训练效果

论文链接&#xff1a; https://arxiv.org/abs/2307.05695 代码仓库&#xff1a; https://github.com/guitaricet/peft_pretraining 一段时间以来&#xff0c;大模型&#xff08;LLMs&#xff09;社区的研究人员开始关注于如何降低训练、微调和推理LLMs所需要的庞大算力&#xf…

【洁洁送书第五期】为什么我们要了解可观测性工程

导读 可观测性已成为一个热门话题&#xff0c;并广受关注。随着它的普及&#xff0c;“可观测性”不幸被误作“监控”或“系统遥测”的同义词。可观测性是软件系统的一个特征。而且&#xff0c;只有当团队采用新的实践进行持续开发时&#xff0c;才能在生产软件系统中有效利用这…

22款美规奔驰S500升级原厂香氛负离子系统,清香宜人,久闻不腻

奔驰原厂香氛合理性可通过车内空气调节组件营造芳香四溢的怡人氛围。通过更换手套箱内香氛喷雾发生器所用的香水瓶&#xff0c;可轻松选择其他香氛。香氛的浓度和持续时间可调。淡雅的香氛缓缓喷出&#xff0c;并且在关闭后能够立刻散去。车内气味不会永久改变&#xff0c;香氛…