RuoYi-Vue-fast异步任务处理:线程池配置与使用

RuoYi-Vue-fast异步任务处理:线程池配置与使用

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

在现代Web应用开发中,异步任务处理是提升系统性能和用户体验的关键技术。RuoYi-Vue-fast作为基于SpringBoot和Vue的前后端分离权限管理系统,内置了完善的异步任务处理机制。本文将详细介绍其线程池配置方案、任务管理实现及实际应用场景,帮助开发人员快速掌握异步任务的使用方法。

线程池核心配置

RuoYi-Vue-fast通过ThreadPoolConfig类实现线程池的集中配置,位于src/main/java/com/ruoyi/framework/config/ThreadPoolConfig.java。该配置类定义了两种核心线程池:

常规任务线程池

@Bean(name = "threadPoolTaskExecutor")
public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setMaxPoolSize(maxPoolSize);      // 最大线程数:200
    executor.setCorePoolSize(corePoolSize);    // 核心线程数:50
    executor.setQueueCapacity(queueCapacity);  // 队列容量:1000
    executor.setKeepAliveSeconds(keepAliveSeconds); // 空闲时间:300秒
    // 拒绝策略:由调用者线程执行
    executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
    return executor;
}

定时任务线程池

@Bean(name = "scheduledExecutorService")
protected ScheduledExecutorService scheduledExecutorService() {
    return new ScheduledThreadPoolExecutor(corePoolSize,
            new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
            new ThreadPoolExecutor.CallerRunsPolicy()) {
        @Override
        protected void afterExecute(Runnable r, Throwable t) {
            super.afterExecute(r, t);
            Threads.printException(r, t);  // 异常处理
        }
    };
}

线程池参数设计遵循以下原则:

  • 核心线程数:设置为CPU核心数的5-10倍,确保充分利用系统资源
  • 队列容量:采用有界队列(1000)防止内存溢出,无界队列可能导致OOM
  • 拒绝策略:使用CallerRunsPolicy在任务过载时降级执行,避免任务丢失

异步任务管理器

系统通过AsyncManager实现异步任务的统一调度,位于src/main/java/com/ruoyi/framework/manager/AsyncManager.java。该类采用单例模式设计,核心代码如下:

public class AsyncManager {
    // 操作延迟10毫秒,避免立即执行对主线程造成影响
    private final int OPERATE_DELAY_TIME = 10;
    
    // 获取定时任务线程池
    private ScheduledExecutorService executor = SpringUtils.getBean("scheduledExecutorService");
    
    // 单例实例
    private static AsyncManager me = new AsyncManager();
    
    public static AsyncManager me() {
        return me;
    }
    
    // 执行任务
    public void execute(TimerTask task) {
        executor.schedule(task, OPERATE_DELAY_TIME, TimeUnit.MILLISECONDS);
    }
}

AsyncManager的核心优势在于:

  • 提供统一的任务提交入口,简化异步编程
  • 内置10毫秒延迟执行机制,避免短时间内大量任务对系统造成冲击
  • 通过SpringUtils动态获取线程池实例,便于配置调整和测试

任务工厂与常用场景

系统提供AsyncFactory工厂类(src/main/java/com/ruoyi/framework/manager/factory/AsyncFactory.java),封装了常用异步任务模板,主要包括:

登录日志记录

public static TimerTask recordLogininfor(final String username, final String status, 
                                        final String message, final Object... args) {
    return new TimerTask() {
        @Override
        public void run() {
            // 获取客户端信息
            String ip = IpUtils.getIpAddr();
            String address = AddressUtils.getRealAddressByIP(ip);
            // 日志持久化
            SysLogininfor logininfor = new SysLogininfor();
            logininfor.setUserName(username);
            logininfor.setIpaddr(ip);
            logininfor.setLoginLocation(address);
            // ... 其他属性设置
            SpringUtils.getBean(ISysLogininforService.class).insertLogininfor(logininfor);
        }
    };
}

操作日志记录

public static TimerTask recordOper(final SysOperLog operLog) {
    return new TimerTask() {
        @Override
        public void run() {
            operLog.setOperLocation(AddressUtils.getRealAddressByIP(operLog.getOperIp()));
            SpringUtils.getBean(ISysOperLogService.class).insertOperlog(operLog);
        }
    };
}

这些工厂方法在系统中的典型应用场景包括:

  1. 登录登出日志src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
  1. 操作审计日志src/main/java/com/ruoyi/framework/aspectj/LogAspect.java
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
  1. 用户注册通知src/main/java/com/ruoyi/framework/security/service/SysRegisterService.java
AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.REGISTER, 
                      MessageUtils.message("user.register.success")));

自定义异步任务开发

基于系统提供的异步框架,开发自定义异步任务只需三步:

1. 创建任务类(可选)

public class CustomTask implements TimerTask {
    private String param;
    
    public CustomTask(String param) {
        this.param = param;
    }
    
    @Override
    public void run() {
        // 任务执行逻辑
        log.info("自定义异步任务执行,参数:{}", param);
        // 业务处理...
    }
}

2. 调用执行

// 直接执行任务
AsyncManager.me().execute(new CustomTask("测试参数"));

// 或通过工厂方法执行
AsyncManager.me().execute(AsyncFactory.recordLogininfor("admin", "LOGIN", "登录成功"));

3. 异常处理

系统在ThreadPoolConfig中已配置全局异常处理:

@Override
protected void afterExecute(Runnable r, Throwable t) {
    super.afterExecute(r, t);
    Threads.printException(r, t);
}

其中Threads.printException方法位于src/main/java/com/ruoyi/common/utils/Threads.java,确保异步任务异常能够被正确捕获和记录。

线程池监控与调优

关键监控指标

  1. 活跃线程数:通过SpringBoot Actuator监控threadPoolTaskExecutor.activeCount
  2. 队列使用率:监控队列当前元素数与容量的比值
  3. 任务完成数:统计threadPoolTaskExecutor.completedTaskCount

调优建议

  1. 核心线程数:根据CPU核心数和任务类型调整,CPU密集型任务建议设置为CPU核心数+1,IO密集型任务可设置为CPU核心数*2
  2. 队列容量:根据内存大小调整,避免过大导致OOM
  3. 拒绝策略:非关键任务可采用DiscardPolicy,核心任务建议使用CallerRunsPolicy

总结

RuoYi-Vue-fast通过ThreadPoolConfigAsyncManagerAsyncFactory三个核心组件,构建了功能完善的异步任务处理体系。该体系具有以下特点:

  1. 配置集中化:通过注解式配置实现线程池参数的统一管理
  2. 使用简单化:封装后的API使异步任务调用只需一行代码
  3. 扩展灵活化:支持自定义任务和工厂方法
  4. 异常安全化:完善的异常处理机制确保任务可靠执行

开发人员在使用异步任务时,应优先考虑系统提供的标准组件,如需自定义开发,建议遵循现有代码规范,确保系统架构的一致性和可维护性。完整的异步任务处理逻辑可参考项目中的日志模块实现,具体代码位于src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.javasrc/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java

【免费下载链接】RuoYi-Vue-fast :tada: (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统 【免费下载链接】RuoYi-Vue-fast 项目地址: https://gitcode.com/GitHub_Trending/ru/RuoYi-Vue-fast

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值