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);
}
};
}
这些工厂方法在系统中的典型应用场景包括:
AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
AsyncManager.me().execute(AsyncFactory.recordOper(operLog));
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,确保异步任务异常能够被正确捕获和记录。
线程池监控与调优
关键监控指标
- 活跃线程数:通过SpringBoot Actuator监控
threadPoolTaskExecutor.activeCount - 队列使用率:监控队列当前元素数与容量的比值
- 任务完成数:统计
threadPoolTaskExecutor.completedTaskCount
调优建议
- 核心线程数:根据CPU核心数和任务类型调整,CPU密集型任务建议设置为
CPU核心数+1,IO密集型任务可设置为CPU核心数*2 - 队列容量:根据内存大小调整,避免过大导致OOM
- 拒绝策略:非关键任务可采用
DiscardPolicy,核心任务建议使用CallerRunsPolicy
总结
RuoYi-Vue-fast通过ThreadPoolConfig、AsyncManager和AsyncFactory三个核心组件,构建了功能完善的异步任务处理体系。该体系具有以下特点:
- 配置集中化:通过注解式配置实现线程池参数的统一管理
- 使用简单化:封装后的API使异步任务调用只需一行代码
- 扩展灵活化:支持自定义任务和工厂方法
- 异常安全化:完善的异常处理机制确保任务可靠执行
开发人员在使用异步任务时,应优先考虑系统提供的标准组件,如需自定义开发,建议遵循现有代码规范,确保系统架构的一致性和可维护性。完整的异步任务处理逻辑可参考项目中的日志模块实现,具体代码位于src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.java和src/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



