spring的ThreadPoolTaskExecutor装饰器传递调用线程信息给线程池中的线程

news2024/9/25 19:23:59

概述

需求是想在线程池执行任务的时候,在开始前将调用线程的信息传到子线程中,在子线程完成后,再清除传入的数据。

下面使用了springThreadPoolTaskExecutor来实现这个需求.

ThreadPoolTaskExecutor

jdk中使用的是ThreadPoolExecutor,用于自定义线程池。
spring中则是对ThreadPoolExecutor又包了一层,加了一些参数进去ThreadPoolTaskExecutor,然后作为bean注入到springioc容器中.

通常在使用线程池的时候想把调用线程的一些信息传递给子线程(线程池中的线程),一般都是要自己写一个装饰器,然后把装饰器传递给线程池的execute方法。

不过spring中已经有现成的方法了,就在ThreadPoolTaskExecutor中,可以给定自定义的装饰器。

org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor#initializeExecutor
可以看到在初始化的时候会判断是否存在装饰器
在这里插入图片描述

ThreadPoolTaskExecutor使用装饰器传递调用线程信息

这样线程池中的线程在执行的时候都会经过装饰器处理,要注意的是在线程执行完成之后需要把信息清理,不然信息会串的

package org.xxx.common.core.executor.decorator;

import org.slf4j.MDC;
import org.springframework.core.task.TaskDecorator;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

import java.util.Map;


/**
 * 对spring的线程中的线程进行装饰
 */

public class ContextCopyingDecorator implements TaskDecorator {


    @Override
    public Runnable decorate(Runnable runnable) {
        try {

            //当前请求上下文
            RequestAttributes context = RequestContextHolder.currentRequestAttributes();

            //copy当前调用线程的 ThreadLocalMap 中保存的信息
            Map<String,String> previous = MDC.getCopyOfContextMap();
            return () -> {
                try {
                    //http request上下文塞到当前线程中
                    RequestContextHolder.setRequestAttributes(context);
                    //将调用线程的 ThreadLocalMap 塞到当前线程
                    MDC.setContextMap(previous);
                    runnable.run();
                } finally {
                    //clear
                    RequestContextHolder.resetRequestAttributes();
                    MDC.clear();
                }
            };
        } catch (IllegalStateException e) {
            return runnable;
        }
    }
}



//线程池配置


/**
 * 核心线程数 = cpu 核心数 + 1
 */
private final int core = Runtime.getRuntime().availableProcessors() + 1;

private ScheduledExecutorService scheduledExecutorService;

@Bean(name = "threadPoolTaskExecutor")
@ConditionalOnProperty(prefix = "thread-pool", name = "enabled", havingValue = "true")
public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolProperties threadPoolProperties) {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

    executor.setCorePoolSize(threadPoolProperties.getCoreSize());
    executor.setMaxPoolSize(threadPoolProperties.getMaxCoreSize());

    if(threadPoolProperties.getCoreSize() == 0) executor.setCorePoolSize(core);
    if(threadPoolProperties.getMaxCoreSize() == 0) executor.setMaxPoolSize(core * 2);

    //线程池队列大小
    executor.setQueueCapacity(threadPoolProperties.getQueueCapacity());

    //线程空闲存活时间
    executor.setKeepAliveSeconds(threadPoolProperties.getKeepAliveSeconds());

    //线程池拒绝时交由调用线程执行
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

    //装饰线程池中的线程
    executor.setTaskDecorator(new ContextCopyingDecorator());

    return executor;
}

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

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

相关文章

跨境电商运营的新趋势:自养号测评补单技术解析

当前阶段&#xff0c;亚马逊、速卖通、虾皮、lazada等主流跨境电商平台的主要推广方式仍然是广告投放&#xff0c;毕竟这是平台的主要收入来源之一。然而&#xff0c;随着越来越多的卖家进军跨境市场&#xff0c;市场竞争日趋激烈&#xff0c;传统的广告投入效果逐渐减弱。在这…

泡泡玛特大火,潮玩行业如何利用软文推广出圈

随着经济的发展&#xff0c;各类潮玩创意落地、新产品层出不穷&#xff0c;也导致潮玩行业陷入了类目繁多&#xff0c;但是新品很难出圈的困境。泡泡玛特作为年轻人中十分受欢迎的品牌&#xff0c;紧跟消费浪潮&#xff0c;成为国内营销赛道上一个让人无法忽视的潮玩IP。那么潮…

12万汉语源流词典汉字记性ACCESS\EXCEL数据库

《12万汉语源流词典汉字记性ACCESS数据库》在继承前人经验的基础上&#xff0c;注意吸收今人的研究成果&#xff0c;注重形音义的密切配合&#xff0c;尽可能历史地、正确地反映汉字形音义的发展。在字形方面&#xff0c;简要说明其结构的演变。语义解释遵循古今语义的发展变化…

408-2012

一、单项选择题&#xff08;2分/题&#xff09; 1.求整数 n&#xff08;n>0&#xff09;阶乘的算法如下其时间复杂度是______。 int fact(int n){if(n<1){return 1;}return n*fact(n-1); } A.O() B.O(n) C.O() D.O(n^2) 解答&#xff1a;B 2.已知操…

PyTorch深度学习(五)【卷积神经网络】

卷积神经网络(基础篇)&#xff1a; 下采样&#xff08;Subsampling&#xff09;&#xff1a;通道数不变&#xff0c;减少数据量&#xff0c;降低运算需求。 做这个卷积&#xff1a; 网络&#xff1a; 最大池化层&#xff08;MaxPooling&#xff09;&#xff1a;通道数不变&…

测试用例设计底层逻辑

【软件测试行业现状】2023年了你还敢学软件测试&#xff1f;未来已寄..测试人该何去何从&#xff1f;【自动化测试、测试开发、性能测试】 测试用例是每位测试人员都绕不开的话题&#xff0c;也是大家习以为常的事情。几乎所有测试相关的公众号、博客、专栏&#xff0c;都会提及…

openstack wallaby 对应 需要的python版本 3.8.18

Python 3.6 (default in CentOS 8.0) Python 3.8 (latest available; default in Ubuntu 20.04) Tested Runtimes for Wallaby — OpenStack Technical Committee Governance Documents x86_64 CentOS8.3.2011 python 3.6.8 安装报错 python3 -m pip install nova23.2.2 手…

LeetCode(力扣)96. 不同的二叉搜索树Python

LeetCode96. 不同的二叉搜索树 题目链接代码 题目链接 https://leetcode.cn/problems/unique-binary-search-trees/description/ 代码 class Solution:def numTrees(self, n: int) -> int:dp [0] * (n 1)dp[0] 1for i in range(1, n 1):for j in range(1, i 1):dp[…

Flutter开发桌面应用的一些探索分享

引言 在移动应用开发领域&#xff0c;Flutter已经赢得了广泛的认可和采用&#xff0c;成为了跨平台移动应用开发的瑞士军刀。然而&#xff0c;Flutter的魅力并不仅限于移动平台&#xff0c;它还可以用于开发桌面应用程序&#xff0c;为开发人员提供了一种全新的选择。本文将深…

Ubuntu 安装 CUDA 与 CUDNN GPU加速引擎

一、NVIDIA&#xff08;英伟达&#xff09;显卡驱动安装 NVIDIA显卡驱动可以通过指令sudo apt purge nvidia*删除以前安装的NVIDIA驱动版本&#xff0c;重新安装。 1.1. 关闭系统自带驱动nouveau 注意&#xff01;在安装NVIDIA驱动以前需要禁止系统自带显卡驱动nouveau&#xf…

关于包,类名,方法名的命名规范

保持与数据库同名的一个命名规范的规则 方法名采用驼峰命名法&#xff0c;保持与数据库同名的一个命名规范的规则 类名采用首字母大写&#xff0c;驼峰命名法&#xff0c;保持与数据库同名的一个命名规范的规则 包名全部使用小写&#xff0c;保持与数据库同名的一个命名规范的规…

element-table排序icon没有点亮

<el-table :data"tableData" ref"tableRef"border :sort"defaultSort":default-sort"defaultSort"><el-table-column sortable :sort-orders"sortOrder" prop"date" label"日期"> </el-…

记录一个ABB机器人RobotStudio软件智能组件的神奇地方(走进科学来了都得拍三天)

“走进科学”来了都得拍三天 背景&#xff1a; 做项目的时候生产线产品规格比较多、位置有偏差&#xff0c;robotstudio仿真中为了设备能用于所有规格的产品需要对所有规格的产品进行测试&#xff0c;修改完产品规格和位置进行测试&#xff0c;测试完再改规格、位置再测试过于…

想知道视频二维码制作方法吗?方法很简单

现在扫码看视频的应用越来越多&#xff0c;很多人都开始用这种方式来展示内容&#xff0c;比如产品介绍或者使用教程就是常用的一种方式。将视频生成二维码后印刷在宣传单或者包装上&#xff0c;来让购买者了解产品的详情和使用。那么视频二维码制作的方法是什么样的呢&#xf…

【OS】操作系统课程笔记 第四章 中断和处理机调度

什么是调度&#xff1f; 调度就是采用特定算法&#xff0c;安排多个作业或进程运行。 4.1 中断 中断对于操作系统的五个作用&#xff1a;&#xff08;可能考简答题&#xff09; 实现多道程序设计与并发的基础解决主机与外设的并行工作问题具备控制和管理计算机&#xff0c;…

深度探讨丨区块链领域企业的未来之路

发表时间&#xff1a;2022年8月4日 信息来源&#xff1a;bsvblockchain.org 随着公司越来越多地采用区块链和人工智能等新技术&#xff0c;他们也应当注意其中的一些机遇与挑战。这是近期在波兰华沙举行的“明日技术大会”上的一个主要圆桌讨论议题。 在圆桌讨论中&#xff0c…

wpf资源Resources探究性学习(一)

测试环境&#xff1a; vistual studio 2017 .net framework 3.5 window 10 新建WPF应用(.net framework)&#xff0c;项目名称为&#xff1a;WpfDemo&#xff0c;如下图&#xff1a; 新建完项目后&#xff0c;默认带有一个名为MainWindow.xaml的代码 一 简单使用字符串资源…

《Java极简设计模式》第07章:装饰模式(Decorator)

作者&#xff1a;冰河 星球&#xff1a;http://m6z.cn/6aeFbs 博客&#xff1a;https://binghe.gitcode.host 文章汇总&#xff1a;https://binghe.gitcode.host/md/all/all.html 源码地址&#xff1a;https://github.com/binghe001/java-simple-design-patterns/tree/master/j…

十二、MySql的事务(下)

文章目录 一、事务隔离级别&#xff08;一&#xff09;如何理解隔离性&#xff08;二&#xff09;隔离级别1.读未提交【Read Uncommitted】&#xff1a;2.读提交【Read Committed】 &#xff1a;3.可重复读【Repeatable Read】&#xff1a;4.串行化【Serializable】: &#xff…

fabic.js Quadratic Curve /可控制的曲线

需要绘制一条可控制的贝塞尔曲线&#xff0c;发现fabic官网中一个demo有点类似。感兴趣的可以移步官网查看demo。 官网的demo是对于html 而言的&#xff0c;放在vue中需要变换一下&#xff0c;具体代码如下&#xff1a; <template><div class"dashboard-contai…