异步任务中传递用户信息的一种优雅写法

目录

  • 前言
  • 基础写法
    • 测试示例
  • 升级写法
    • 测试示例

前言

在异步任务中,我们通常会遇到子任务获取当前用户的场景。我们可能会采取ThreadLocal来存储主线程传递的用户信息。然后在业务开始时set,业务结束时remove,来保证不会出现OOM的场景。

基础写法

@SpringBootTest
public class UserAsyncTransmitTest {@Resourceprivate Executor myTaskExecutor;@Resourceprivate TestService testService;@Testvoid test() throws InterruptedException {LoginUser loginUser = LoginUser.builder().username("zhangsan").build();System.out.println("主线程start==================");myTaskExecutor.execute(() -> {UserContext.setLoginUser(loginUser);try {testService.doSomething();} catch (Exception e) {e.printStackTrace();} finally {UserContext.remove();}});Thread.sleep(5000L);System.out.println("主线程end===================");}
}

测试示例

在这里插入图片描述

运行结果:
在这里插入图片描述

这种写法,每次写异步任务需要用户时,都要把用户信息set,remove。那么有没有一种写法可以让写业务代码时更加纯粹一点,让程序员更关注业务,代码更加美观呢?
其实,我们可以自定义Runnable加上自定义线程池来实现。

升级写法

  • UserContextRunnable.java
public class UserContextRunnable implements Runnable {private final LoginUser currentUser;private final Runnable runnable;public UserContextRunnable(LoginUser currentUser, Runnable runnable) {this.currentUser = currentUser;this.runnable = runnable;}@Overridepublic void run() {try {UserContext.setLoginUser(currentUser);runnable.run();} finally {UserContext.remove();}}
}
  • UserContextTaskExecutor.java
public class UserContextTaskExecutor extends ThreadPoolTaskExecutor {private static final long serialVersionUID = 7334165009514720624L;private LoginUser currentUser;public void user(LoginUser currentUser) {this.currentUser = currentUser;}public void execute(LoginUser currentUser, @NotNull Runnable task) {super.execute(new UserContextRunnable(currentUser, task));}public void execute(@NotNull Runnable task) {if (currentUser != null) {super.execute(new UserContextRunnable(currentUser, task));}else{super.execute(task);}}
}

测试示例

@SpringBootTest
public class UserAsyncTransmitTest {@Resourceprivate Executor userContextTaskExecutor;@Resourceprivate TestService testService;@Testvoid test() throws InterruptedException {LoginUser loginUser = LoginUser.builder().username("zhangsan").build();System.out.println("主线程start==================");userContextTaskExecutor.execute(new UserContextRunnable(loginUser, ()-> testService.doSomething()));Thread.sleep(5000L);System.out.println("主线程end===================");}
}

运行结果:
在这里插入图片描述

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

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

相关文章

数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比

开源生态 众所周知,MySQL主备库(两节点)一般通过异步复制、半同步复制(Semi-Sync)来实现数据高可用,但主备架构在机房网络故障、主机hang住等异常场景下,HA切换后大概率就会出现数据不一致的问…

Vue打包文件dist放在SpringBoot项目下运行(正确实现全过程)(下)

在上一篇中,实现了Vue打包文件dist放在SpringBoot项目下运行。 Vue打包文件dist放在SpringBoot项目下运行(正确实现全过程)(上) 问题 路由刷新会产生404的问题。 原因 vue开发的应用,采用的是SPA单页…

【Linux网络】网络基础

本篇博客整理了 Linux 网络编程的前置知识,例如网络的发展、协议和协议栈分层、网络通信原理、网络地址等,为后续进入 Linux 网络编程作铺垫。 目录 一、网络发展 二、网络协议 1)协议的作用 2)协议栈 3)协议分层…

大吉大利杯_RE

A-Maze-In 一道比较新颖的 maze 题吧, 地图长度是 256 32 * 8 ? 不知道了 0.0 难崩,看了一下 wp 说map长度什么的都有,应该就是 16 * 16的 看了一圈,感觉还是要把 DFS,BFS 算法学一下,直接跑…

中国内陆水体氮沉降数据集(1990s-2010s)

全球大气氮沉降急剧增加对内陆水生态系统产生不良影响。中国是全球三大氮沉降热点地区之一,为了充分了解氮沉降对中国内陆水体的影响,制定合理的水污染治理方案,我们需要清楚的量化内陆水体的氮沉降通量。为此,我们利用LMDZ-OR-IN…

Lambda表达式与函数式工具应用详解

在现代编程中,Lambda表达式和函数式工具是处理数据、实现简洁代码的重要工具。尤其是在函数式编程范式中,它们发挥着至关重要的作用。本文将从定义、语法、应用场景到具体案例,详细阐述Lambda表达式和函数式工具在Python和Java等编程语言中的…

Syslog 管理工具

Syslog常被称为系统日志或系统记录,是一种用来在互联网协议(TCP/IP)的网上中传递记录档消息的标准,常用来指涉实际的Syslog 协议,或者那些提交syslog消息的应用程序或数据库。 系统日志协议(Syslog&#x…

VBA即用型代码手册:删除完全空白的行

我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…

星辰考古:TiDB v4.0 进化前夜

前情回顾TiDB v4 时间线TiDB v4 新特性 TiDBTiKVPDTiFlashTiCDCTiDB v4 兼容性变化 TiDBTiKVPD其他TiDB 社区互助升级活动TiDB 3.0.20 升级到 4.0.16 注意事项升级速览直观变化总结素材来源🌻 往期精彩 ▼ 前情回顾 在前面的章节中,我们共同梳理了 TiDB …

BUCK电源芯片,电气参数,极限参数,工作特性,引脚功能

概述 在应用DC-DC开关电源芯片时,通常需要关注以下参数,同步与非同步,输入电压,输入电流,输出电压,输出电流,输入输出电容的选择;mosfet选型,电感选型,功耗&a…

人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程10-PyTorch神经网络之卷积神经网络实战与代码详解。卷积神经网络(CNN)是一种广泛应用于图像识别、目标检测、视频分析等领域的深度学习模型。本文将详细介绍卷积…

vue-router history 模式下将所有资源文件js/css/img都存放在oss 利用 cdn 访问整体思路汇总

背景 我们有一个域名https://example.com,但是ssl证书很贵,搞子域名来承接新站点有点费钱,所以我们想用一个目录https://example.com/admin/ 来作为管理后台的站点,这个站点是单页面应用,我又想让其用history router的…

Redis基础教程(十六):Redis Stream

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Qt常用基础控件总结—带边框的部件(QFrame和QLabel)

带边框的部件 框架控件QFrame类 QFrame类介绍 QFrame 类是带有边框的部件的基类,带边框部件的特点是有一个明显的边框,QFrame类就是用来实现边框的不同效果的(把这种效果称为边框样式),所有继承自 QFrame 的子类都可以使用 QFrame 类实现的效果。 部件通常是矩形的(其他…

谷粒商城学习笔记-18-快速开发-配置测试微服务基本CRUD功能

文章目录 一,product模块整合mybatis-plus1,引入依赖2,product启动类指定mapper所在包3,在配置文件配置数据库连接信息4,在配置文件中配置mapper.xml映射文件信息 二,单元测试1,编写测试代码&am…

凯中精密:下一个正丹吗?

业绩预增超十倍! 又一匹A股业绩黑马诞生——凯中精密 近期,凯中精密发布2024年上半年业绩预告,预计净利润增速高达1068%至1402%。 从23年的209.54%到24年Q1惊人的6885.78%,再到24年上半年的十倍增速,这条业绩黑马利润…

【python算法学习2】冒泡排序的写法

目的:学习冒泡排序的写法 1 定义 1.1百度百科 冒泡排序_百度百科在程序设计语言中,排序算法主要有冒泡排序、快速排序、选择排序以及计数排序等。冒泡排序(Bubble Sort)是最简单和最通用的排序方法,其基本思想是&…

设计模式 - 最简单最有趣的方式讲述

别名《我替你看Head First设计模式》 本文以故事的形式带你从0了解设计模式,在其中你仅仅是一名刚入职的实习生,在项目中摸爬滚打。(以没有一行真正代码的形式,让你无压力趣味学习) 设计模式 策略模式观察者模式装饰者…

springboot仪器校准系统-计算机毕业设计源码51504

摘 要 随着科技的不断发展。测量设备的准确性和可靠性对于各行各业都至关重要。仪器校准系统作为确保测量设备性能的重要手段,已成为工业生产、科学研究、质量控制等领域不可或缺的一部分。本文对仪器校准系统进行了概述,探讨了校准方法、流程、特点、应…

Apache防盗链、网页压缩、网页缓存

目录 网页压缩 类型 示例 动态添加模块操作步骤 重装Apache操作步骤 网页缓存 示例 操作步骤 隐藏版本信息 操作步骤 Apache防盗链 定义 原理 配置防盗链实验环境 实验环境 本地图片盗链示例 操作步骤 防盗链示例 操作步骤 网页压缩 网站的访问速度是由多个…