From 695d21793e0ba9a359a079d2718d57bbfb5e35ae Mon Sep 17 00:00:00 2001 From: clay <20932067@zju.edu.cn> Date: Thu, 11 Apr 2024 14:52:41 +0800 Subject: [PATCH] =?UTF-8?q?fix=20:=20=E6=B5=81=E7=A8=8B=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=A4=9A=E7=BA=BF=E7=A8=8B=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/service/ProcessNodeService.java | 112 +++++++++--------- 1 file changed, 55 insertions(+), 57 deletions(-) diff --git a/workflow/src/main/java/cn/fateverse/workflow/service/ProcessNodeService.java b/workflow/src/main/java/cn/fateverse/workflow/service/ProcessNodeService.java index c4ed388..daad7b6 100644 --- a/workflow/src/main/java/cn/fateverse/workflow/service/ProcessNodeService.java +++ b/workflow/src/main/java/cn/fateverse/workflow/service/ProcessNodeService.java @@ -37,17 +37,6 @@ public class ProcessNodeService { @DubboReference private DubboUserService userService; - /** - * 用户id缓存 - */ - private final Map> cacheUserIdMap; - //角色用户缓存 - private final Map> cacheRoleCacheUserMap; - //部门用户缓存 - private final Map cacheDeptCacheUserMap; - - //用户缓存信息 - private final Map cacheUserMap; public ProcessNodeService() { @@ -57,10 +46,6 @@ public class ProcessNodeService { TimeUnit.SECONDS, new LinkedBlockingDeque<>(128), new ThreadFactoryBuilder().setNameFormat("process_%d").build(), new ThreadPoolExecutor.CallerRunsPolicy()); - cacheUserIdMap = new ConcurrentHashMap<>(); - cacheRoleCacheUserMap = new ConcurrentHashMap<>(); - cacheDeptCacheUserMap = new ConcurrentHashMap<>(); - cacheUserMap = new ConcurrentHashMap<>(); } @@ -92,29 +77,11 @@ public class ProcessNodeService { } catch (InterruptedException e) { throw new RuntimeException(e); } - clearCache(); + wrapper.clearCache(); System.out.println("用时 :" + (new Date().getTime() - startTime.getTime())); return wrapper.result; } - /** - * 初始化 - */ - - /** - * 清除缓存,当空间大于16时进行清除 - */ - private void clearCache() { - if (cacheRoleCacheUserMap.size() > 16) { - cacheRoleCacheUserMap.clear(); - } - if (cacheUserIdMap.size() > 16) { - cacheUserIdMap.clear(); - } - if (cacheUserMap.size() > 16) { - cacheUserMap.clear(); - } - } /** * 根据角色查询 @@ -122,12 +89,12 @@ public class ProcessNodeService { * @param roleIds 角色id列表 * @return 用户信息 */ - private List searchUserListByRoleIds(List roleIds) { + private List searchUserListByRoleIds(List roleIds, ProcessNodeWrapper wrapper) { List result = new ArrayList<>(); List roleIdsNew = new ArrayList<>(); roleIds.forEach(roleId -> { - if (cacheRoleCacheUserMap.containsKey(roleId)) { - result.addAll(cacheRoleCacheUserMap.get(roleId)); + if (wrapper.cacheRoleCacheUserMap.containsKey(roleId)) { + result.addAll(wrapper.cacheRoleCacheUserMap.get(roleId)); } else { roleIdsNew.add(roleId); } @@ -135,7 +102,7 @@ public class ProcessNodeService { if (!roleIdsNew.isEmpty()) { List userList = userService.searchUserListByRoleIds(roleIdsNew); Map> userRole = userList.stream().collect(Collectors.groupingBy(UserVo::getRoleId)); - cacheRoleCacheUserMap.putAll(userRole); + wrapper.cacheRoleCacheUserMap.putAll(userRole); result.addAll(userList); } return result.stream().map(userVo -> @@ -148,12 +115,12 @@ public class ProcessNodeService { * @param deptIds 部门id列表 * @return 用户信息 */ - private List searchUserByDeptIds(List deptIds) { + private List searchUserByDeptIds(List deptIds, ProcessNodeWrapper wrapper) { List result = new ArrayList<>(); List deptIdsNew = new ArrayList<>(); deptIds.forEach(deptId -> { - if (cacheDeptCacheUserMap.containsKey(deptId)) { - result.add(cacheDeptCacheUserMap.get(deptId)); + if (wrapper.cacheDeptCacheUserMap.containsKey(deptId)) { + result.add(wrapper.cacheDeptCacheUserMap.get(deptId)); } else { deptIdsNew.add(deptId); } @@ -163,7 +130,7 @@ public class ProcessNodeService { userList.forEach(userVo -> { UserInfo value = UserInfo.toUserInfo(userVo, OperationStateEnums.UNACTIVATED); result.add(value); - cacheDeptCacheUserMap.put(userVo.getLeaderDeptId(), value); + wrapper.cacheDeptCacheUserMap.put(userVo.getLeaderDeptId(), value); }); } return result; @@ -175,12 +142,12 @@ public class ProcessNodeService { * @param userIds * @return 用户信息列表 */ - private List searchUserListByUserIds(List userIds) { + private List searchUserListByUserIds(List userIds, ProcessNodeWrapper wrapper) { List result = new ArrayList<>(); List userIdsNew = new ArrayList<>(); userIds.forEach(userId -> { - if (cacheUserMap.containsKey(userId)) { - result.add(cacheUserMap.get(userId)); + if (wrapper.cacheUserMap.containsKey(userId)) { + result.add(wrapper.cacheUserMap.get(userId)); } else { userIdsNew.add(userId); } @@ -190,7 +157,7 @@ public class ProcessNodeService { userList.forEach(userVo -> { UserInfo value = UserInfo.toUserInfo(userVo, OperationStateEnums.UNACTIVATED); result.add(value); - cacheUserMap.put(userVo.getUserId(), value); + wrapper.cacheUserMap.put(userVo.getUserId(), value); }); } return result; @@ -304,7 +271,7 @@ public class ProcessNodeService { List parentIds = Arrays.stream(dept.getAncestors().split(",")).map(Long::valueOf).collect(Collectors.toList()); switch (endCondition) { case "TOP"://直接到最上层 - assignedUser = searchUserByDeptIds(parentIds.subList(1, parentIds.size())); + assignedUser = searchUserByDeptIds(parentIds.subList(1, parentIds.size()), wrapper); break; case "LEAVE"://到指定级别 int level = Integer.parseInt(leaderTop.get("level").toString()); @@ -315,7 +282,7 @@ public class ProcessNodeService { } else { leaderDeptIds = parentIds.subList(parentIds.size() - level, parentIds.size()); } - assignedUser = searchUserByDeptIds(leaderDeptIds); + assignedUser = searchUserByDeptIds(leaderDeptIds, wrapper); break; default: throw new CustomException("当前选项还未实现!"); @@ -331,7 +298,7 @@ public class ProcessNodeService { int level = Integer.parseInt(props.getLeader().get("level").toString()); Dept dept = wrapper.user.getDept(); if (1 == level) { - assignedUser = searchUserListByUserIds(Collections.singletonList(dept.getDeptId())); + assignedUser = searchUserListByUserIds(Collections.singletonList(dept.getDeptId()), wrapper); } else { List parentIds = Arrays.stream(dept.getAncestors().split(",")).map(Long::valueOf).collect(Collectors.toList()); Long leaderDeptId = null; @@ -341,7 +308,7 @@ public class ProcessNodeService { } else { leaderDeptId = parentIds.get(parentIds.size() - level); } - assignedUser = searchUserByDeptIds(Collections.singletonList(leaderDeptId)); + assignedUser = searchUserByDeptIds(Collections.singletonList(leaderDeptId), wrapper); } props.setAssignedUser(assignedUser); props.setAssignedType(AssigneeTypeEnums.ASSIGN_USER); @@ -374,7 +341,7 @@ public class ProcessNodeService { List assignedUser; List roleIds = props.getRoleList().stream().map(RoleInfo::getRoleId).collect(Collectors.toList()); //rpc远程通过角色id获取到当前角色下的所有用户数据 - assignedUser = searchUserListByRoleIds(roleIds); + assignedUser = searchUserListByRoleIds(roleIds, wrapper); props.setAssignedUser(assignedUser); props.setAssignedType(AssigneeTypeEnums.ASSIGN_USER); setResult(processNode, wrapper); @@ -383,12 +350,15 @@ public class ProcessNodeService { private static class ProcessNodeWrapper { - public ProcessNodeWrapper(Map> userOperationInfoMap, JSONObject optionalUser, User user, Boolean isStart) { - this.userOperationInfoMap = userOperationInfoMap; - this.optionalUser = optionalUser; - this.user = user; - this.isStart = isStart; - } + + //用户id缓存 + private final Map> cacheUserIdMap; + //角色用户缓存 + private final Map> cacheRoleCacheUserMap; + //部门用户缓存 + private final Map cacheDeptCacheUserMap; + //用户缓存信息 + private final Map cacheUserMap; //操作历史缓存 private final Map> userOperationInfoMap; @@ -397,5 +367,33 @@ public class ProcessNodeService { private final List result = new ArrayList<>(); private final User user; private final Boolean isStart; + + + public ProcessNodeWrapper(Map> userOperationInfoMap, JSONObject optionalUser, User user, Boolean isStart) { + this.userOperationInfoMap = userOperationInfoMap; + this.optionalUser = optionalUser; + this.user = user; + this.isStart = isStart; + this.cacheUserIdMap = new ConcurrentHashMap<>(); + this.cacheRoleCacheUserMap = new ConcurrentHashMap<>(); + this.cacheDeptCacheUserMap = new ConcurrentHashMap<>(); + this.cacheUserMap = new ConcurrentHashMap<>(); + } + + /** + * 清除缓存,当空间大于16时进行清除 + */ + private void clearCache() { + if (cacheRoleCacheUserMap.size() > 16) { + cacheRoleCacheUserMap.clear(); + } + if (cacheUserIdMap.size() > 16) { + cacheUserIdMap.clear(); + } + if (cacheUserMap.size() > 16) { + cacheUserMap.clear(); + } + } + } }