当前位置: 首页 > news >正文

ruoyi-vue使用线程池进行异步开发

1.异步线程池工具类

@Configuration
public class ThreadExecutorUtils
{
    // 核心线程池大小
    private int corePoolSize = 50;

    // 最大可创建的线程数
    private int maxPoolSize = 200;

    // 队列最大长度
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds = 300;

    @Bean(name = "taskExecutor")
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //核心线程池大小
        executor.setCorePoolSize(corePoolSize);
        //最大线程数
        executor.setMaxPoolSize(maxPoolSize);
        //队列容量
        executor.setQueueCapacity(queueCapacity);
        //活跃时间
        executor.setKeepAliveSeconds(keepAliveSeconds);
        //线程名字前缀
        executor.setThreadNamePrefix("ty-async-");
        // setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
        // CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize();
        return executor;
    }


}

2.在需要使用异步操作的service实现类注入上面的类

  @Autowired
  private ThreadExecutorUtils threadPoolTaskExecutor;

3.使用线程池进行异步操作

  Executor executor = threadPoolTaskExecutor.getAsyncExecutor();
  //addVisitHistory为本类中定义的一个异步执行的业务方法
  executor.execute(() -> addVisitHistory(userId, spuId));

需要注意的地方:如果项目采用多数据源,在异步线程中,由于多数据源的动态切换通常依赖于线程本地变量(如 ThreadLocal),而异步线程会丢失主线程的上下文(包括 ThreadLocal 中的数据源信息),因此需要额外的处理来确保数据源的一致性。

下面介绍一种示例处理方法:

// 获取当前数据源
String currentDataSource = DataSourceContextHolder.getDataSource();

// 创建异步任务
CompletableFuture.runAsync(() -> {
    // 在异步线程中设置数据源
    DataSourceContextHolder.setDataSource(currentDataSource);
    try {
        // 执行业务逻辑
        someService.doSomething();
    } finally {
        // 清除数据源
        DataSourceContextHolder.clearDataSource();
    }
}, executor);

优点

  • 简单直接,易于理解。

  • 适用于少量异步任务的场景。

缺点

  • 需要手动传递和设置数据源,代码侵入性较强。

  • 如果异步任务嵌套较多,容易遗漏数据源的设置

相关文章:

  • pandas-基础(数据结构及文件访问)
  • 【2025年24期免费获取股票数据API接口】实例演示五种主流语言获取股票行情api接口之沪深A股最近10天资金流入趋势数据获取实例演示及接口API说明文档
  • 在Oracle中编写雪花算法升学雪花ID
  • 基于python大数据的汽车舆情可视化及分析系统
  • MySQL的日志
  • 【AUTOSAR 基础软件】存储栈(NvM、MemIf、Fee)详解
  • 蓝桥杯嵌入式组第七届省赛题目解析+STM32G431RBT6实现源码
  • git本地仓库链接远程仓库
  • 【Linux系统编程】初识系统编程
  • visual studio 2022 E0020: 未定义标识符 “string“
  • shell学习-第四天
  • Qt常用控件之 纵向列表QListWidget
  • 边界网关协议(BGP)技术详解:原理、应用与配置实践
  • Django与数据库
  • Redis数据结构——set
  • C语言(队列)
  • 算法.习题篇
  • 论文阅读_大型语言模型个性化劝说的黑暗模式
  • 第一个Hadoop程序
  • C++ 二叉搜索树代码
  • 网站开发模式b s/上海企业网站seo
  • c2c代表性企业网站/如何优化关键词的方法
  • 新网站制作市场/友情链接查询友情链接检测
  • 大连网站建设在线/百度开店怎么收费
  • 四川省建设厅职业注册中心网站/关键词优化推广排名软件
  • wordpress php版本/广州seo培训