refactor: 使用事件解耦业务副作用并优化虚拟线程并发
- 新增登录成功事件,解耦在线用户缓存、登录日志和最近登录信息更新 - 新增在线用户清理事件,角色授权变更后异步清理受影响用户会话 - 新增 OSS 配置变更事件,统一处理配置初始化、删除和默认配置切换后的缓存刷新 - 新增工作流抄送、待办消息、结果消息事件,拆分全局监听器中的副作用逻辑 - 扩展 ThreadUtils 支持带返回值的虚拟线程批量执行 - 在线用户监控批量读取 Redis 会话信息时使用虚拟线程并发处理 - OSS 多文件查询、URL 解析和 DTO 转换使用虚拟线程并发处理 - 工作流办理人回显和用户解析按类型并发查询 - 工作流多渠道消息发送改为并发执行 - WebSocket 与 SSE 广播消息按用户并发发送
This commit is contained in:
+41
-1
@@ -2,11 +2,12 @@ package org.dromara.common.core.utils;
|
||||
|
||||
import lombok.AccessLevel;
|
||||
import lombok.NoArgsConstructor;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.*;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* 线程工具
|
||||
@@ -38,4 +39,43 @@ public class ThreadUtils {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量执行有返回值的任务
|
||||
*
|
||||
* @param supplierList 任务列表
|
||||
* @param <T> 返回值类型
|
||||
* @return 按提交顺序返回的任务结果
|
||||
*/
|
||||
@SafeVarargs
|
||||
public static <T> List<T> virtualSubmitAll(Supplier<T>... supplierList) {
|
||||
return virtualSubmitAll(List.of(supplierList));
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量执行有返回值的任务
|
||||
*
|
||||
* @param supplierList 任务列表
|
||||
* @param <T> 返回值类型
|
||||
* @return 按提交顺序返回的任务结果
|
||||
*/
|
||||
public static <T> List<T> virtualSubmitAll(Collection<? extends Supplier<T>> supplierList) {
|
||||
List<Future<T>> futureList = new ArrayList<>();
|
||||
try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
|
||||
for (Supplier<T> supplier : supplierList) {
|
||||
futureList.add(executor.submit(supplier::get));
|
||||
}
|
||||
List<T> resultList = new ArrayList<>(futureList.size());
|
||||
for (Future<T> future : futureList) {
|
||||
resultList.add(future.get());
|
||||
}
|
||||
return resultList;
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
throw new RuntimeException("线程执行被中断", e);
|
||||
} catch (ExecutionException e) {
|
||||
Throwable cause = e.getCause() == null ? e : e.getCause();
|
||||
throw new RuntimeException("线程执行异常:" + cause.getMessage(), cause);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user