Java-12.Spring 中通过 ThreadPoolTaskExecutor 和 AsyncConfigurerSupport 配置默认异步线程池

Java-12a.Spring 中通过 TaskDecorator 配置默认异步线程池

前言

虽然在 SpringBoot 2.7.x 中已经有关于异步线程池的默认配置,但如果还是要自定义的需求,仍然值得学习了解一下。

例如:想要在多线程池中添加 traceId;使用 transmittable-thread-local 来代替默认的 ThreadLocal

多线程日志追踪工具类

MdcUtil

public class MdcUtil {  public static final String TRACE_ID = "traceId";  public static String generateTraceId() {  return UUID.randomUUID().toString().replace("-", "");  }  public static String getTraceId() {  return MDC.get(TRACE_ID);  }  public static void setTraceId(String traceId) {  MDC.put(TRACE_ID, traceId);  }  public static void setContextMap(Map<String, String> context) {  MDC.setContextMap(context);  }  public static void removeTraceId() {  MDC.remove(TRACE_ID);  }  public static void clear() {  MDC.clear();  }  
}

ThreadMdcUtil

public class ThreadMdcUtil {  public static void setTraceIdIfAbsent() {  if (MdcUtil.getTraceId() == null) {  MdcUtil.setTraceId(MdcUtil.generateTraceId());  }  }  public static <T> Callable<T> wrap(final Callable<T> callable, final Map<String, String> context) {  return () -> {  if (context == null) {  MdcUtil.clear();  } else {  MdcUtil.setContextMap(context);  }  setTraceIdIfAbsent();  try {  return callable.call();  } finally {  MdcUtil.clear();  }  };  }  public static Runnable wrap(final Runnable runnable, final Map<String, String> context) {  return () -> {  if (context == null) {  MdcUtil.clear();  } else {  MdcUtil.setContextMap(context);  }  //设置traceId  setTraceIdIfAbsent();  try {  runnable.run();  } finally {  MdcUtil.clear();  }  };  }  
}

自定义 ThreadPoolTaskExecutor

/**  * 日志追踪线程池配置  *  * @author fengxc */public class CustomThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {  @Override  public void execute(@NotNull Runnable task) {  super.execute(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));  }  @NotNull  @Override    public Future<?> submit(@NotNull Runnable task) {  return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));  }  @NotNull  @Override    public <T> Future<T> submit(@NotNull Callable<T> task) {  return super.submit(ThreadMdcUtil.wrap(task, MDC.getCopyOfContextMap()));  }  
}

继承 AsyncConfigurerSupport 实现默认的异步线程池

@EnableAsync  
@SpringBootConfiguration  
@EnableConfigurationProperties(TaskExecutionProperties.class)  
public class ThreadPoolConfig extends AsyncConfigurerSupport {  @Resource  private TaskExecutionProperties properties;  /**  * 重写默认线程池配置,@Async异步会使用这个线程池  */  @Override  public Executor getAsyncExecutor() {  TaskExecutionProperties.Pool pool = properties.getPool();  TaskExecutorBuilder builder = new TaskExecutorBuilder();  builder = builder.queueCapacity(pool.getQueueCapacity());  builder = builder.corePoolSize(pool.getCoreSize());  builder = builder.maxPoolSize(pool.getMaxSize());  builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout());  builder = builder.keepAlive(pool.getKeepAlive());  Shutdown shutdown = properties.getShutdown();  builder = builder.awaitTermination(shutdown.isAwaitTermination());  builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod());  builder = builder.threadNamePrefix(properties.getThreadNamePrefix());  CustomThreadPoolTaskExecutor executor = builder.build(CustomThreadPoolTaskExecutor.class);  executor.initialize();  return TtlExecutors.getTtlExecutor(executor);  }  @Override  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {  return new SimpleAsyncUncaughtExceptionHandler();  }  }

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

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

相关文章

【DC-DC】AP5125 降压恒流驱动器 60W LED电源驱动方案PCB+BOM表

这是一款60WLED驱动方案,线路图如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 特点应用领域应用原理图AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定…

APUE学习之进程间通信(IPC)(下篇)

目录 一、进程间通信&#xff08;IPC&#xff09; 二、信号量&#xff08;Semaphore&#xff09; 1、基本概念 2、同步关系与互斥关系 3、临界区与临界资源 4、信号量的工作原理 5、信号量编程 6、实战演练 三、共享内存&#xff08;Shared Memory&#xff09; 1、…

如何使用 Maltego 情报调查保姆级教程(附链接)

前言 使用软件需要挂梯子 一、介绍 Maltego 是一种开放源代码的情报和数据连接工具&#xff0c;专注于网络情报收集和图形化分析。它为用户提供了一个交互式的界面&#xff0c;用于收集、分析和可视化有关目标的信息。Maltego 被广泛用于网络侦查、威胁情报、渗透测试和安全…

Windows、Linux、Mac数据库的安装(mysql、MongoDB、Redis)

数据库的安装 作为数据存储的重要部分&#xff0c;数据库同样是必不可少的&#xff0c;数据库可以分为关系型数据库和非关系型数据库。 关系型数据库如 SQLite、MySQL、Oracle、SQL Server、DB2 等&#xff0c;其数据库是以表的形式存储&#xff1b;非关系型数据库如 MongoDB…

科普类——遥操作中的延时问题(二)

遥操作中的延时问题 遥操作中延时&#xff08;Latency&#xff09;问题是一个关键挑战&#xff0c;因为延时会导致操作员的指令不能及时传递给无人驾驶车辆&#xff0c;从而影响车辆的响应速度和安全性。为了解决或减轻延时问题&#xff0c;可以采取以下措施&#xff1a; 优化通…

我用Rust开发Rocketmq name server

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com 1. Rocketmq-rust namesrv概述 经过一个多月的开发&#xff0c;终…

【web安全】文件上传漏洞

upload-labs靶场 第一关 绕过前端 先打开哥斯拉&#xff0c;生成木马&#xff0c;选择php 打开brup开浏览器&#xff0c;上传文件&#xff0c;就会发现被阻止了&#xff0c;还没抓到包呢 那就是被前端代码阻止了&#xff0c;那通常前端代码都只能防御后缀名 我们抓到包后直…

php+Layui开发的网站信息探针查询源码

信息探针是一款基于layui开发的专业查询好友个人信息的程序。 自定义设置探针页面&#xff0c;探针功能&#xff0c;QQ分享&#xff0c;通知邮箱等功能。 生成页面链接好友点击会出现好友ip 位置信息&#xff0c;手机型号ua头浏览器等信息 gps需要注册百度地图开发者才可以使用…

盒子模型的内容总结

知识引入 1.认识盒子模型 在浏览网站时我们会发现内容都是按照区域划分的。这使得网页很工整、美观。在页面中&#xff0c;每一块区域分别承载不同的内容&#xff0c;使得网页的内容虽然零散&#xff0c;但是在版式排列上依然清晰有条理。如图1 图1 *承载内容的区域称为盒子…

镀锌板行业分析:我国市场消费量约为527万吨

镀锌板是指表面镀有一层锌的钢板。镀锌钢板为了防止钢板表面遭受腐蚀延长其使用寿命&#xff0c;会在钢板表面涂以一层金属锌&#xff0c;这种涂锌的钢板称为镀锌板。镀锌是一种经常采用的经济而有效的防锈方法&#xff0c;世界上锌产量的一半左右均用于此种工艺。 中国的迅…

数字护盾:深度探讨Sentinel的三大流控策略

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数字护盾&#xff1a;深度探讨Sentinel的三大流控策略 前言快速失败策略&#xff1a;数字守卫的拦截术快速失败策略的基本原理&#xff1a;示例场景演示&#xff1a; Warm Up策略&#xff1a;数字城堡…

编程笔记 html5cssjs 067 JavaScrip String数据类型

编程笔记 html5&css&js 067 JavaScrip String数据类型 一、String数据类型二、类型运算三、代码示例小结 Javascript语言中的String数据类型详解。JavaScript 中的 String 数据类型用于表示文本数据。字符串是不可变的&#xff0c;这意味着一旦创建了一个字符串&#x…

如何安装配置HFS并实现无公网ip远程访问本地电脑共享文件

文章目录 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留隧道2.2 隧道名称2.3 成功使用cpolar创建二级子域名访问本地hfs 总结 前言 在大厂的云存储产品热度下降后&#xff0c;私人的NAS热度快速上升&#xff0c;其中最…

HiveSQL题——窗口函数(lag/lead)

目录 一、窗口函数的知识点 1.1 窗户函数的定义 1.2 窗户函数的语法 1.3 窗口函数分类 1.4 前后函数:lag/lead 二、实际案例 2.1 股票的波峰波谷 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 前后列转换&#xff08;面试题&#xff09; 0 问题描述 1 数据准备 …

使用mkcert生成服务证书和客户端证书并导入到java中

github下载mkcert https://github.com/FiloSottile/mkcert 服务器ip地址为192.168.1.1 生成服务器证书 mkcert 192.168.1.1获取到192.168.1.1.pem和192.168.1.1.key.pem文件 将文件配置到服务器中 本地安装证书 mkcert -install在其他客户端手动导入证书到java中 执行两…

Pytest中doctests的测试方法应用

在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…

Habitat环境学习一:导航任务概述

导航任务 概述&#xff1a; Agent需要导航到环境中的指定位置&#xff0c;而该位置可以由特定的目标形式指定。 PointGoal Navigation&#xff1a;导航到环境中相对于初始位置特定的点&#xff1b; Object Navigation&#xff1a;Agent需要在环境中找到特定的物体&#xff1…

【C++】类和对象(一)

前言&#xff1a;在前面我们带大家初步步入了C&#xff0c;让大家大概知道了他的样子&#xff0c;那今天就可以说我们要正式步入C的大门了&#xff0c;这一章内容的细节比较多各位学习的时候一定要仔细。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f…

leetcode 27.移除元素(python版)

需求 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度…

如何多好一个FMEA——SunFMEA软件

尽管FMEA的理念和流程相对简单&#xff0c;但在实际操作中&#xff0c;许多企业发现FMEA的实施并不容易&#xff0c;往往无法达到预期的效果。今天SunFMEA软件和大家一起 SunFMEA软件 首先&#xff0c;FMEA的实施需要跨部门、跨领域的团队合作。然而&#xff0c;在很多企业中&a…