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

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

前言

在Spring框架中,TaskDecorator 是一个接口,它可以用来自定义由 ThreadPoolTaskExecutor 或其他任务执行器管理的任务的装饰行为。这通常用于在执行任务之前和之后添加某些上下文相关的行为,比如设置线程上下文或者清理资源。

例如,在执行异步操作时,你可能需要将主线程的一些上下文信息(比如用户身份验证令牌或请求上下文信息)传递给执行异步操作的线程。TaskDecorator 就可以在这种场景下发挥作用。

自定义 TaskDecorator

public class ThreadPoolContextTaskDecorator implements TaskDecorator {  @Override  public Runnable decorate(Runnable runnable) {  return TtlRunnable.get(ThreadMdcUtil.wrap(runnable, 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());  builder.taskDecorator(new ThreadPoolContextTaskDecorator());  // 重点是这里ThreadPoolTaskExecutor executor = builder.build();  executor.initialize();  return executor;  }  @Override  public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {  return new SimpleAsyncUncaughtExceptionHandler();  }  }

也可以直接定义一个 TaskDecorator Bean

查看源码 TaskExecutionAutoConfiguration

@ConditionalOnClass(ThreadPoolTaskExecutor.class)  
@AutoConfiguration  
@EnableConfigurationProperties(TaskExecutionProperties.class)  
public class TaskExecutionAutoConfiguration {  /**  * Bean name of the application {@link TaskExecutor}.  */    public static final String APPLICATION_TASK_EXECUTOR_BEAN_NAME = "applicationTaskExecutor";  @Bean  @ConditionalOnMissingBean    public TaskExecutorBuilder taskExecutorBuilder(TaskExecutionProperties properties,  ObjectProvider<TaskExecutorCustomizer> taskExecutorCustomizers,  ObjectProvider<TaskDecorator> taskDecorator) {  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());  builder = builder.customizers(taskExecutorCustomizers.orderedStream()::iterator);  // spring-boot-autoconfigure 这里提供了 TaskDecorator 的入口// 只需要提供一个 TaskDecorator 的Bean 就可以复用 Spring Boot 中的异步线程池啦builder = builder.taskDecorator(taskDecorator.getIfUnique());return builder;  }  @Lazy  @Bean(name = { APPLICATION_TASK_EXECUTOR_BEAN_NAME,  AsyncAnnotationBeanPostProcessor.DEFAULT_TASK_EXECUTOR_BEAN_NAME })  @ConditionalOnMissingBean(Executor.class)  public ThreadPoolTaskExecutor applicationTaskExecutor(TaskExecutorBuilder builder) {  return builder.build();  }  }

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

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

相关文章

第32关 k8s集群管理开源神器 - k9s

------> 课程视频同步分享在今日头条和B站 大家好&#xff0c;我是博哥爱运维。 随着我们管理维护的K8S集群上线&#xff0c;怎么管理好集群上面成百上千的服务pod&#xff0c;就是我们该操心的事情了。这里博哥把在生产中一直在用的一个开源管理工具k8s&#xff0c;github…

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出&#xff0c;滑到最下面&#xff0c;出现这个就说明构建成功了&#xff0c;如果没有出现&#xff0c;说明构建有问题&#xff0c;需要解决好问题才能启动哦~

C++实现通讯录管理系统

目录 1、系统需求 2、创建项目 2.1 创建项目 3、菜单功能 4、退出功能 5、添加联系人 5.1 设计联系人结构体 5.2 设计通讯录结构体 5.3 main函数中创建通讯录 5.4 封装联系人函数 5.5 测试添加联系人功能 6、显示联系人 6.1 封装显示联系人函数 7、删除联系人 7.1…

GPT栏目:yarn 安装

GPT栏目&#xff1a;yarn 安装 一、前言 在跟GPT交互的时候&#xff0c;发现最近gpt4给出的答案率有了比较明显的提高&#xff0c;简单记录一下&#xff0c;我用gpt4拿到的答案吧。 本人已按照这个步骤成功 二、具体步骤 要安装 yarn&#xff0c;你可以按照以下步骤进行操作…

MyBatis常见面试题汇总

说一下MyBatis执行流程&#xff1f; MyBatis是一款优秀的基于Java的持久层框架&#xff0c;它内部封装了JDBC&#xff0c;使开发者只需要关注SQL语句本身&#xff0c;而不需要花费精力去处理加载驱动、创建连接等的过程&#xff0c;MyBatis的执行流程如下&#xff1a; 加载配…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明&#xff1a; 仅供学习使用。 一、题目描述 题目共4问&#xff0c;描述网络通信中的 帧传输时延&#xff08;Frame Delay&#xff09;、传播时延&#xff08;Propagation Delay&#xff09;&#xff0c;以及 链接利用率&#xff08;Link Utilization&#xff09; 的相关…

【NodeJS】005- NodeJS的NVM与express框架

1.NVM介绍与使用 1.介绍 nvm 全称 Node Version Manager 顾名思义它是用来管理 node 版本的工具,方便切换不同版本的Node.js 2.使用 nvm 的使用非常的简单,跟 npm 的使用方法类似 3.下载安装 首先先下载 nvm,下载地址 https://github.com/coreybutler/nvm-windows/rel…

Vue2:通过代理服务器解决跨域问题

一、场景描述 现在的项目大多数是前后端分离的。Vue前端项目通过ajax去请求后端接口的时候&#xff0c;会有同源策略的限制。从而产生跨域问题。 二、基本概念 1、什么是同源策略&#xff1f; 就是前端服务和后端服务的协议名&#xff0c;IP或主机名&#xff0c;端口号不完…

0x02递推与递归

0x02递推与递归 递推者&#xff0c;自小而大&#xff0c;循序渐进&#xff1b;递归者&#xff0c;由上而下&#xff0c;分而治之 文章目录 0x02递推与递归例题T1&#xff1a;T2&#xff1a;T3&#xff1a;T4:T5T6 例题 T1&#xff1a; 92. 递归实现指数型枚举 - AcWing题库 …

Mysql 插入数据

1 为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值。基本语法格式为&#xff1a; INSERT INTO table_name (column_list) VALUES (value_list); 使用INSERT插入数据时&#xff0c;允许列名称列表column_list为空&#xff0c;此时&…

网络安全战略中的法律问题

文章目录 前言一、各国网络安全的法律需求陡增二、战争的多维化使对法律的需求也越加多样(一)从平时到战时,网络斗争的平战模糊性增加法律适用难度(二)从高维到低维,博弈的多维性使法律需求层次更加丰富(三)从防御到进攻,网络空间的攻防不均衡改变法律斗争重点三、各国…

flink分别使用FilterMap和ProcessFunction实现去重逻辑

背景 在日常的工作中&#xff0c;对数据去重是一件很常见的操作&#xff0c;比如我们只需要保留重复记录的第一条&#xff0c;而忽略掉后续重复的记录&#xff0c;达到去重的效果&#xff0c;本文就使用flink的FilterMap和ProcessFunction来实现去重逻辑 FilterMap和ProcessF…

Compose | UI组件(十) | Box,Surface - 帧布局

文章目录 前言Box 组件的参数说明Box 组件的使用Surface 的参数说明Surface 的使用 总结 前言 Box组件是 按子组件依次叠加 的布局组件&#xff0c;相当传统View中的 FrameLayout Box 组件的参数说明 Composable inline fun Box(modifier: Modifier Modifier, …

Web服务器之Tomcat

文章目录 Web 服务器软件简介资源分类访问流程常见的Web服务器软件 Tomcat简介使用步骤使用Tomcat注意事项部署项目的方式方式一方式二方式三 问题中文乱码黑窗口一闪而过启动报错 Web 服务器软件 简介 服务器&#xff1a;安装了服务器软件的计算机服务器软件&#xff1a;接收…

漏洞原理远程命令执行

漏洞原理远程命令/代码执行 远程命令执行函数&#xff08;Remote Command Execution Function&#xff09;是指在一个网络环境中&#xff0c;通过远程执行命令来控制另一个计算机系统或设备的功能。 远程命令执行函数可以通过网络协议&#xff08;如SSH、Telnet、RPC等&#x…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么&#xff1f; 直角三角形的三个边之间有什么关系。 为什么重要&#xff1f; 它提供了几何和代数之间的重要联系&#xff0c;使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么&#xff1f; 测绘、导航&#xff0c;以及较近代出现的狭义和广义相对论…

第一节课,用户管理--后端初始化,项目调通。二次翻工2

一、网址来源&#xff1a; 快速开始 | MyBatis-Plus (baomidou.com) 进程&#xff1a; ​ 二、[此处不看]添加测试类&#xff0c;看下效果 2.1 参考 一、第一节课&#xff0c;用户管理--后端初始化&#xff0c;项目调通-CSDN博客 ​ 2.2 新建 SampleTest ​ 2.3 复…

SouthLeetCode-打卡24年01月第3周

SouthLeetCode-打卡24年01月第3周 // Date : 2024/01/15 ~ 2024/01/21 013.二分查找 (1) 题目描述 013#LeetCode.27.#北岸计划2024/01/15 // 略 (2) 题解代码 // 重做 014.移除元素 (1) 题目描述 014#LeetCode.160.#北岸计划2024/01/16 (2) 题解代码 Version1.0 c…

SpringMVC RESTful风格

Restful是一种软件架构风格、设计风格&#xff0c;而不是标准&#xff0c;只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件&#xff0c;基于这个风格设计的软件可以更简洁&#xff0c;更有层次&#xff0c;更易于实现缓存机制等。 Restful风格的请求是…