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);

优点

  • 简单直接,易于理解。

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

缺点

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

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

### 关于 RuoYi-Vue-Plus 与 RuoYi-Vue-Pro 的差异 #### 功能特性对比 RuoYi-Vue-Plus 是基于 Vue.js 实现的企业级中后台前端框架,集成了众多实用的功能模块和优化措施[^1]。而 RuoYi-Vue-Pro 则是在此基础上进一步增强和完善的产品版本。 - **权限管理** - 在 Plus 版本中实现了较为完善的权限控制机制,支持多种鉴权方式以及细粒度的操作授权;Pro 版本不仅继承了这些功能还增加了动态路由懒加载等功能来提升性能并简化开发流程。 - **组件库丰富程度** - Plus 提供了一套完整的业务组件集合用于快速搭建页面布局结构等需求场景下的使用;相比之下 Pro 扩展了更多高级别的UI控件如图表展示、文件上传下载插件等满足复杂应用场景的要求。 ```javascript // 权限验证逻辑示例 (假设) function checkPermission(permissionName) { const userPermissions = getUserPermissions(); // 获取当前用户的权限列表 return userPermissions.includes(permissionName); } ``` #### 技术栈更新情况 对于技术选型方面: - RuoYi-Vue-Plus 主要依赖 Element UI 组件库构建界面元素,并采用 axios 进行 HTTP 请求处理; -RuoYi-Vue-Pro 更倾向于选用最新的前端技术和工具链组合,例如可能引入 Ant Design Vue 或者其他更现代化的设计体系作为默认样式指南,在网络请求上也可能替换为更加灵活高效的解决方案像 fetch API 结合拦截器模式实现数据交互操作。 #### 性能表现考量 考虑到实际运行效率因素: - Plus 已经做了很多底层架构上的改进工作以确保良好的用户体验,比如通过 Webpack 构建配置减少打包体积加快首屏渲染速度; - Pro 可能在原有基础上继续探索前沿的技术手段如 Server-Side Rendering (服务端渲染)、Code Splitting(代码分割)等方式进一步提高整体响应时间及资源利用率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值