refactor: 使用事件解耦业务副作用并优化虚拟线程并发
- 新增登录成功事件,解耦在线用户缓存、登录日志和最近登录信息更新 - 新增在线用户清理事件,角色授权变更后异步清理受影响用户会话 - 新增 OSS 配置变更事件,统一处理配置初始化、删除和默认配置切换后的缓存刷新 - 新增工作流抄送、待办消息、结果消息事件,拆分全局监听器中的副作用逻辑 - 扩展 ThreadUtils 支持带返回值的虚拟线程批量执行 - 在线用户监控批量读取 Redis 会话信息时使用虚拟线程并发处理 - OSS 多文件查询、URL 解析和 DTO 转换使用虚拟线程并发处理 - 工作流办理人回显和用户解析按类型并发查询 - 工作流多渠道消息发送改为并发执行 - WebSocket 与 SSE 广播消息按用户并发发送
This commit is contained in:
+15
-12
@@ -10,6 +10,7 @@ import org.dromara.common.core.domain.PageResult;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.utils.StreamUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.core.utils.ThreadUtils;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
import org.dromara.common.redis.annotation.RepeatSubmit;
|
||||
@@ -19,11 +20,10 @@ import org.dromara.system.api.domain.UserOnlineDTO;
|
||||
import org.dromara.system.domain.SysUserOnline;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* 在线用户监控
|
||||
@@ -47,15 +47,16 @@ public class SysUserOnlineController extends BaseController {
|
||||
public R<PageResult<SysUserOnline>> list(String ipaddr, String userName) {
|
||||
// 获取所有未过期的 token
|
||||
Collection<String> keys = RedisUtils.keys(CacheNames.ONLINE_TOKEN_KEY + "*");
|
||||
List<UserOnlineDTO> userOnlineDTOList = new ArrayList<>();
|
||||
for (String key : keys) {
|
||||
List<Supplier<UserOnlineDTO>> suppliers = keys.stream().map(key -> (Supplier<UserOnlineDTO>) () -> {
|
||||
String token = StringUtils.substringAfterLast(key, ":");
|
||||
// 如果已经过期则跳过
|
||||
if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) {
|
||||
continue;
|
||||
return null;
|
||||
}
|
||||
userOnlineDTOList.add(RedisUtils.getCacheObject(CacheNames.ONLINE_TOKEN_KEY + token));
|
||||
}
|
||||
return RedisUtils.getCacheObject(CacheNames.ONLINE_TOKEN_KEY + token);
|
||||
}).toList();
|
||||
List<UserOnlineDTO> userOnlineDTOList = ThreadUtils.virtualSubmitAll(suppliers);
|
||||
userOnlineDTOList.removeAll(Collections.singleton(null));
|
||||
if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName)) {
|
||||
userOnlineDTOList = StreamUtils.filter(userOnlineDTOList, userOnline ->
|
||||
StringUtils.equals(ipaddr, userOnline.getIpaddr()) &&
|
||||
@@ -71,7 +72,6 @@ public class SysUserOnlineController extends BaseController {
|
||||
);
|
||||
}
|
||||
Collections.reverse(userOnlineDTOList);
|
||||
userOnlineDTOList.removeAll(Collections.singleton(null));
|
||||
List<SysUserOnline> userOnlineList = BeanUtil.copyToList(userOnlineDTOList, SysUserOnline.class);
|
||||
return R.ok(PageResult.build(userOnlineList));
|
||||
}
|
||||
@@ -103,10 +103,13 @@ public class SysUserOnlineController extends BaseController {
|
||||
public R<PageResult<SysUserOnline>> getInfo() {
|
||||
// 获取指定账号 id 的 token 集合
|
||||
List<String> tokenIds = StpUtil.getTokenValueListByLoginId(StpUtil.getLoginIdAsString());
|
||||
List<UserOnlineDTO> userOnlineDTOList = tokenIds.stream()
|
||||
.filter(token -> StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) >= -1)
|
||||
.map(token -> (UserOnlineDTO) RedisUtils.getCacheObject(CacheNames.ONLINE_TOKEN_KEY + token))
|
||||
.collect(Collectors.toList());
|
||||
List<Supplier<UserOnlineDTO>> suppliers = tokenIds.stream().map(token -> (Supplier<UserOnlineDTO>) () -> {
|
||||
if (StpUtil.stpLogic.getTokenActiveTimeoutByToken(token) < -1) {
|
||||
return null;
|
||||
}
|
||||
return RedisUtils.getCacheObject(CacheNames.ONLINE_TOKEN_KEY + token);
|
||||
}).toList();
|
||||
List<UserOnlineDTO> userOnlineDTOList = ThreadUtils.virtualSubmitAll(suppliers);
|
||||
//复制和处理 SysUserOnline 对象列表
|
||||
Collections.reverse(userOnlineDTOList);
|
||||
userOnlineDTOList.removeAll(Collections.singleton(null));
|
||||
|
||||
+5
-3
@@ -6,6 +6,7 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.common.core.domain.PageResult;
|
||||
import org.dromara.common.core.domain.R;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.excel.utils.ExcelBuilder;
|
||||
import org.dromara.common.log.annotation.Log;
|
||||
import org.dromara.common.log.enums.BusinessType;
|
||||
@@ -18,6 +19,7 @@ import org.dromara.system.domain.bo.SysRoleBo;
|
||||
import org.dromara.system.domain.bo.SysUserBo;
|
||||
import org.dromara.system.domain.vo.SysRoleVo;
|
||||
import org.dromara.system.domain.vo.SysUserVo;
|
||||
import org.dromara.system.event.OnlineUserCleanEvent;
|
||||
import org.dromara.system.service.ISysDeptService;
|
||||
import org.dromara.system.service.ISysRoleService;
|
||||
import org.dromara.system.service.ISysUserService;
|
||||
@@ -123,7 +125,7 @@ public class SysRoleController extends BaseController {
|
||||
}
|
||||
|
||||
if (roleService.updateRoleBaseInfo(role) > 0) {
|
||||
roleService.cleanOnlineUserByRole(role.getRoleId());
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byRole(role.getRoleId()));
|
||||
return R.ok();
|
||||
}
|
||||
return R.fail("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
|
||||
@@ -143,7 +145,7 @@ public class SysRoleController extends BaseController {
|
||||
roleService.checkRoleAllowed(role);
|
||||
roleService.checkRoleDataScope(role.getRoleId());
|
||||
if (roleService.updateRolePermission(role) > 0) {
|
||||
roleService.cleanOnlineUserByRole(role.getRoleId());
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byRole(role.getRoleId()));
|
||||
return R.ok();
|
||||
}
|
||||
return R.fail("修改角色'" + role.getRoleName() + "'权限失败,请联系管理员");
|
||||
@@ -163,7 +165,7 @@ public class SysRoleController extends BaseController {
|
||||
roleService.checkRoleAllowed(role);
|
||||
roleService.checkRoleDataScope(role.getRoleId());
|
||||
if (roleService.updateRoleStatus(role.getRoleId(), role.getStatus()) > 0) {
|
||||
roleService.cleanOnlineUserByRole(role.getRoleId());
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byRole(role.getRoleId()));
|
||||
return R.ok();
|
||||
}
|
||||
return R.fail("修改角色'" + role.getRoleName() + "'状态失败,请联系管理员");
|
||||
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package org.dromara.system.event;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 在线用户清理事件。
|
||||
*
|
||||
* @param roleId 角色 ID,存在时清理拥有该角色的在线用户
|
||||
* @param userIds 用户 ID 集合,存在时清理指定在线用户
|
||||
*/
|
||||
public record OnlineUserCleanEvent(Long roleId, Collection<Long> userIds) {
|
||||
|
||||
public OnlineUserCleanEvent {
|
||||
if (CollUtil.isNotEmpty(userIds)) {
|
||||
userIds = List.copyOf(userIds);
|
||||
}
|
||||
}
|
||||
|
||||
public static OnlineUserCleanEvent byRole(Long roleId) {
|
||||
return new OnlineUserCleanEvent(roleId, null);
|
||||
}
|
||||
|
||||
public static OnlineUserCleanEvent byUsers(Collection<Long> userIds) {
|
||||
return new OnlineUserCleanEvent(null, userIds);
|
||||
}
|
||||
|
||||
}
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
package org.dromara.system.event;
|
||||
|
||||
/**
|
||||
* OSS 配置变更事件。
|
||||
*
|
||||
* @param configKey 当前配置 key
|
||||
* @param oldConfigKey 变更前配置 key
|
||||
* @param configJson 当前配置 JSON,为空表示清理缓存
|
||||
* @param defaultConfig 是否设置为默认配置
|
||||
*/
|
||||
public record OssConfigChangeEvent(
|
||||
String configKey,
|
||||
String oldConfigKey,
|
||||
String configJson,
|
||||
boolean defaultConfig
|
||||
) {
|
||||
|
||||
public static OssConfigChangeEvent save(String configKey, String oldConfigKey, String configJson) {
|
||||
return new OssConfigChangeEvent(configKey, oldConfigKey, configJson, false);
|
||||
}
|
||||
|
||||
public static OssConfigChangeEvent remove(String configKey) {
|
||||
return new OssConfigChangeEvent(configKey, null, null, false);
|
||||
}
|
||||
|
||||
public static OssConfigChangeEvent useDefault(String configKey) {
|
||||
return new OssConfigChangeEvent(configKey, null, null, true);
|
||||
}
|
||||
|
||||
}
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
package org.dromara.system.listener;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.dromara.system.event.OnlineUserCleanEvent;
|
||||
import org.dromara.system.service.ISysRoleService;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.event.TransactionPhase;
|
||||
import org.springframework.transaction.event.TransactionalEventListener;
|
||||
|
||||
/**
|
||||
* 在线用户清理监听器。
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class OnlineUserCleanListener {
|
||||
|
||||
private final ISysRoleService roleService;
|
||||
|
||||
/**
|
||||
* 权限或用户角色关系变化后清理受影响的在线用户。
|
||||
*
|
||||
* @param event 在线用户清理事件
|
||||
*/
|
||||
@Async
|
||||
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true)
|
||||
public void cleanOnlineUser(OnlineUserCleanEvent event) {
|
||||
if (event.roleId() != null) {
|
||||
roleService.cleanOnlineUserByRole(event.roleId());
|
||||
}
|
||||
if (CollUtil.isNotEmpty(event.userIds())) {
|
||||
roleService.cleanOnlineUser(event.userIds());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
package org.dromara.system.listener;
|
||||
|
||||
import org.dromara.common.core.constant.CacheNames;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.oss.constant.OssConstant;
|
||||
import org.dromara.common.oss.factory.OssFactory;
|
||||
import org.dromara.common.redis.utils.CacheUtils;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.system.event.OssConfigChangeEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.event.TransactionPhase;
|
||||
import org.springframework.transaction.event.TransactionalEventListener;
|
||||
|
||||
/**
|
||||
* OSS 配置变更监听器。
|
||||
*
|
||||
* @author Lion Li
|
||||
*/
|
||||
@Component
|
||||
public class OssConfigChangeListener {
|
||||
|
||||
/**
|
||||
* 数据提交后同步刷新 OSS 配置缓存与客户端实例。
|
||||
*
|
||||
* @param event OSS 配置变更事件
|
||||
*/
|
||||
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT, fallbackExecution = true)
|
||||
public void refreshOssConfig(OssConfigChangeEvent event) {
|
||||
if (event.defaultConfig()) {
|
||||
RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, event.configKey());
|
||||
return;
|
||||
}
|
||||
if (StringUtils.isNotBlank(event.oldConfigKey()) && !StringUtils.equals(event.oldConfigKey(), event.configKey())) {
|
||||
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, event.oldConfigKey());
|
||||
OssFactory.remove(event.oldConfigKey());
|
||||
}
|
||||
if (StringUtils.isBlank(event.configKey())) {
|
||||
return;
|
||||
}
|
||||
if (StringUtils.isBlank(event.configJson())) {
|
||||
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, event.configKey());
|
||||
} else {
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, event.configKey(), event.configJson());
|
||||
}
|
||||
OssFactory.remove(event.configKey());
|
||||
}
|
||||
|
||||
}
|
||||
+21
-14
@@ -12,17 +12,18 @@ import org.dromara.common.core.domain.PageResult;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.ObjectUtils;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.json.utils.JsonUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
import org.dromara.common.mybatis.core.query.QueryBuilder;
|
||||
import org.dromara.common.oss.constant.OssConstant;
|
||||
import org.dromara.common.oss.factory.OssFactory;
|
||||
import org.dromara.common.redis.utils.CacheUtils;
|
||||
import org.dromara.common.redis.utils.RedisUtils;
|
||||
import org.dromara.system.domain.SysOssConfig;
|
||||
import org.dromara.system.domain.bo.SysOssConfigBo;
|
||||
import org.dromara.system.domain.vo.SysOssConfigVo;
|
||||
import org.dromara.system.event.OssConfigChangeEvent;
|
||||
import org.dromara.system.mapper.SysOssConfigMapper;
|
||||
import org.dromara.system.service.ISysOssConfigService;
|
||||
import org.springframework.stereotype.Service;
|
||||
@@ -30,7 +31,6 @@ import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 对象存储配置Service业务层处理
|
||||
@@ -117,7 +117,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
if (flag) {
|
||||
// 从数据库查询完整的数据做缓存
|
||||
config = ossConfigMapper.selectById(config.getOssConfigId());
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
publishOssConfigSaved(config, null);
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
@@ -143,12 +143,7 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
if (flag) {
|
||||
// 从数据库查询完整的数据做缓存
|
||||
config = ossConfigMapper.selectById(config.getOssConfigId());
|
||||
if (ObjectUtil.isNotNull(oldConfig) && !Objects.equals(oldConfig.getConfigKey(), config.getConfigKey())) {
|
||||
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, oldConfig.getConfigKey());
|
||||
OssFactory.remove(oldConfig.getConfigKey());
|
||||
}
|
||||
CacheUtils.put(CacheNames.SYS_OSS_CONFIG, config.getConfigKey(), JsonUtils.toJsonString(config));
|
||||
OssFactory.remove(config.getConfigKey());
|
||||
publishOssConfigSaved(config, ObjectUtils.notNullGetter(oldConfig, SysOssConfig::getConfigKey));
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
@@ -188,10 +183,8 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
}
|
||||
boolean flag = ossConfigMapper.deleteByIds(ids) > 0;
|
||||
if (flag) {
|
||||
list.forEach(sysOssConfig -> {
|
||||
CacheUtils.evict(CacheNames.SYS_OSS_CONFIG, sysOssConfig.getConfigKey());
|
||||
OssFactory.remove(sysOssConfig.getConfigKey());
|
||||
});
|
||||
list.forEach(sysOssConfig ->
|
||||
SpringUtils.context().publishEvent(OssConfigChangeEvent.remove(sysOssConfig.getConfigKey())));
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
@@ -227,9 +220,23 @@ public class SysOssConfigServiceImpl implements ISysOssConfigService {
|
||||
int row = ossConfigMapper.lambda().set(SysOssConfig::getStatus, SystemConstants.NO).updateCount();
|
||||
row += ossConfigMapper.updateById(sysOssConfig);
|
||||
if (row > 0) {
|
||||
RedisUtils.setCacheObject(OssConstant.DEFAULT_CONFIG_KEY, sysOssConfig.getConfigKey());
|
||||
SpringUtils.context().publishEvent(OssConfigChangeEvent.useDefault(sysOssConfig.getConfigKey()));
|
||||
}
|
||||
return row;
|
||||
}
|
||||
|
||||
/**
|
||||
* 发布 OSS 配置保存事件。
|
||||
*
|
||||
* @param config 当前配置
|
||||
* @param oldConfigKey 变更前配置 key
|
||||
*/
|
||||
private void publishOssConfigSaved(SysOssConfig config, String oldConfigKey) {
|
||||
SpringUtils.context().publishEvent(OssConfigChangeEvent.save(
|
||||
config.getConfigKey(),
|
||||
oldConfigKey,
|
||||
JsonUtils.toJsonString(config)
|
||||
));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+28
-17
@@ -15,6 +15,7 @@ import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.core.utils.StreamUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.core.utils.ThreadUtils;
|
||||
import org.dromara.common.core.utils.file.FileUtils;
|
||||
import org.dromara.common.json.utils.JsonUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
@@ -44,10 +45,11 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* 文件上传 服务层实现
|
||||
@@ -85,19 +87,21 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
|
||||
*/
|
||||
@Override
|
||||
public List<SysOssVo> listByIds(Collection<Long> ossIds) {
|
||||
List<SysOssVo> list = new ArrayList<>();
|
||||
SysOssServiceImpl ossService = SpringUtils.getAopProxy(this);
|
||||
for (Long id : ossIds) {
|
||||
List<Supplier<SysOssVo>> suppliers = ossIds.stream().map(id -> (Supplier<SysOssVo>) () -> {
|
||||
SysOssVo vo = ossService.getById(id);
|
||||
if (ObjectUtil.isNotNull(vo)) {
|
||||
try {
|
||||
list.add(this.matchingUrl(vo));
|
||||
return this.matchingUrl(vo);
|
||||
} catch (Exception ignored) {
|
||||
// 如果oss异常无法连接则将数据直接返回
|
||||
list.add(vo);
|
||||
return vo;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}).toList();
|
||||
List<SysOssVo> list = ThreadUtils.virtualSubmitAll(suppliers);
|
||||
list.removeAll(Collections.singleton(null));
|
||||
return list;
|
||||
}
|
||||
|
||||
@@ -109,19 +113,22 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
|
||||
*/
|
||||
@Override
|
||||
public String selectUrlByIds(String ossIds) {
|
||||
List<String> list = new ArrayList<>();
|
||||
List<Long> ids = StringUtils.splitTo(ossIds, Convert::toLong);
|
||||
SysOssServiceImpl ossService = SpringUtils.getAopProxy(this);
|
||||
for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) {
|
||||
List<Supplier<String>> suppliers = ids.stream().map(id -> (Supplier<String>) () -> {
|
||||
SysOssVo vo = ossService.getById(id);
|
||||
if (ObjectUtil.isNotNull(vo)) {
|
||||
try {
|
||||
list.add(this.matchingUrl(vo).getUrl());
|
||||
return this.matchingUrl(vo).getUrl();
|
||||
} catch (Exception ignored) {
|
||||
// 如果oss异常无法连接则将数据直接返回
|
||||
list.add(vo.getUrl());
|
||||
return vo.getUrl();
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}).toList();
|
||||
List<String> list = ThreadUtils.virtualSubmitAll(suppliers);
|
||||
list.removeAll(Collections.singleton(null));
|
||||
return StringUtils.joinComma(list);
|
||||
}
|
||||
|
||||
@@ -133,19 +140,23 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
|
||||
*/
|
||||
@Override
|
||||
public List<OssDTO> selectByIds(String ossIds) {
|
||||
List<OssDTO> list = new ArrayList<>();
|
||||
for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) {
|
||||
SysOssVo vo = SpringUtils.getAopProxy(this).getById(id);
|
||||
List<Long> ids = StringUtils.splitTo(ossIds, Convert::toLong);
|
||||
var ossService = SpringUtils.getAopProxy(this);
|
||||
List<Supplier<OssDTO>> suppliers = ids.stream().map(id -> (Supplier<OssDTO>) () -> {
|
||||
SysOssVo vo = ossService.getById(id);
|
||||
if (ObjectUtil.isNotNull(vo)) {
|
||||
try {
|
||||
vo.setUrl(this.matchingUrl(vo).getUrl());
|
||||
list.add(BeanUtil.toBean(vo, OssDTO.class));
|
||||
return BeanUtil.toBean(vo, OssDTO.class);
|
||||
} catch (Exception ignored) {
|
||||
// 如果oss异常无法连接则将数据直接返回
|
||||
list.add(BeanUtil.toBean(vo, OssDTO.class));
|
||||
return BeanUtil.toBean(vo, OssDTO.class);
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}).toList();
|
||||
List<OssDTO> list = ThreadUtils.virtualSubmitAll(suppliers);
|
||||
list.removeAll(Collections.singleton(null));
|
||||
return list;
|
||||
}
|
||||
|
||||
|
||||
+5
-3
@@ -13,6 +13,7 @@ import org.dromara.common.core.constant.SystemConstants;
|
||||
import org.dromara.common.core.domain.PageResult;
|
||||
import org.dromara.common.core.exception.ServiceException;
|
||||
import org.dromara.common.core.utils.MapstructUtils;
|
||||
import org.dromara.common.core.utils.SpringUtils;
|
||||
import org.dromara.common.core.utils.StreamUtils;
|
||||
import org.dromara.common.core.utils.StringUtils;
|
||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||
@@ -26,6 +27,7 @@ import org.dromara.system.domain.SysRoleMenu;
|
||||
import org.dromara.system.domain.SysUserRole;
|
||||
import org.dromara.system.domain.bo.SysRoleBo;
|
||||
import org.dromara.system.domain.vo.SysRoleVo;
|
||||
import org.dromara.system.event.OnlineUserCleanEvent;
|
||||
import org.dromara.system.mapper.SysRoleDeptMapper;
|
||||
import org.dromara.system.mapper.SysRoleMapper;
|
||||
import org.dromara.system.mapper.SysRoleMenuMapper;
|
||||
@@ -464,7 +466,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
|
||||
.eq(SysUserRole::getUserId, userRole.getUserId())
|
||||
.deleteCount();
|
||||
if (rows > 0) {
|
||||
cleanOnlineUser(List.of(userRole.getUserId()));
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byUsers(List.of(userRole.getUserId())));
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
@@ -486,7 +488,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
|
||||
.in(SysUserRole::getUserId, userIds)
|
||||
.deleteCount();
|
||||
if (rows > 0) {
|
||||
cleanOnlineUser(userIds);
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byUsers(userIds));
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
@@ -515,7 +517,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
|
||||
rows = userRoleMapper.insertBatch(list) ? list.size() : 0;
|
||||
}
|
||||
if (rows > 0) {
|
||||
cleanOnlineUser(userIds);
|
||||
SpringUtils.context().publishEvent(OnlineUserCleanEvent.byUsers(userIds));
|
||||
}
|
||||
return rows;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user