diff --git a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java index 081f33d653f2a8c72c87b969df6997a894ad1f27..f4bce033da916f689483f8c7df9655e318a7872f 100644 --- a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java +++ b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java @@ -27,11 +27,7 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen @PostConstruct public final void init() { - //初始化TenantContext,避免子类使用TenantContext时出现空指针 - TenantContext.init(); - //TenantContext tenantContext = TenantContext.get(); - //String tenant = tenantContext.getTenantUuid(); - //tenantContext.switchTenant(tenant); + TenantContext.get().setUseMasterDatabase(true); myInit(); } @@ -39,6 +35,7 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen public final void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext c = event.getApplicationContext(); if (c instanceof NeatLogicWebApplicationContext) { + TenantContext.get().setUseMasterDatabase(true); onInitialized((NeatLogicWebApplicationContext) c); } } diff --git a/src/main/java/neatlogic/framework/asynchronization/thread/NeatLogicThread.java b/src/main/java/neatlogic/framework/asynchronization/thread/NeatLogicThread.java index aab6658195ff06a87b60b457c1f319283f125de5..be5147f30121f72dde44a9d4e91df235604d2ad6 100644 --- a/src/main/java/neatlogic/framework/asynchronization/thread/NeatLogicThread.java +++ b/src/main/java/neatlogic/framework/asynchronization/thread/NeatLogicThread.java @@ -17,13 +17,11 @@ package neatlogic.framework.asynchronization.thread; import neatlogic.framework.asynchronization.threadlocal.*; import neatlogic.framework.cache.threadlocal.CacheContext; -import neatlogic.framework.dto.module.ModuleVo; import neatlogic.framework.exception.core.ApiRuntimeException; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; @@ -32,7 +30,6 @@ public abstract class NeatLogicThread implements Runnable, Comparable activeModuleList; protected InputFromContext inputFromContext; protected RequestContext requestContext; private String threadName; @@ -100,7 +97,6 @@ public abstract class NeatLogicThread implements Runnable, Comparable instance = new ThreadLocal<>(); + private static final ConcurrentHashMap> tenantModuleGroupListMap = new ConcurrentHashMap<>(); private String tenantUuid; private Boolean useDefaultDatasource = false; - private List activeModuleList; - private List activeModuleGroupList; - private Map activeModuleMap; private Boolean isData = false; private final String dataDbName = ""; @@ -59,7 +59,6 @@ public class TenantContext implements Serializable { TenantContext context = new TenantContext(); if (_tenantContext != null) { context.setTenantUuid(_tenantContext.getTenantUuid()); - context.setActiveModuleList(_tenantContext.getActiveModuleList()); MDC.put("tenant", _tenantContext.getTenantUuid()); } instance.set(context); @@ -117,35 +116,32 @@ public class TenantContext implements Serializable { public TenantContext switchTenant(String tenantUuid) { if (StringUtils.isNotBlank(tenantUuid)) { this.tenantUuid = tenantUuid; - // 使用master库 - this.setUseMasterDatabase(true); - //防止 ArrayList HashMap 对象在存入 ehcache 之前迭代序列化时,另一个线程对这个 list、map 进行了修改操作 - List tenantModuleGroupList = new ArrayList<>(moduleMapper.getModuleGroupListByTenantUuid(tenantUuid)); - this.activeModuleList = ModuleUtil.getTenantActiveModuleList(tenantModuleGroupList); - this.activeModuleGroupList = new ArrayList<>(); - for (String group : tenantModuleGroupList) { - ModuleGroupVo groupVo = ModuleUtil.getModuleGroup(group); - if (groupVo != null) { - this.activeModuleGroupList.add(groupVo); - } - } - // 还原回租户库 this.setUseMasterDatabase(false); - activeModuleMap = new HashMap<>(); - if (activeModuleList != null && activeModuleList.size() > 0) { - for (ModuleVo module : activeModuleList) { - activeModuleMap.put(module.getId(), module); - } - } MDC.put("tenant", tenantUuid); } return this; } public static TenantContext get() { + if (instance.get() == null) { + init(); + } return instance.get(); } + private List searchModuleGroupList(String tenantUuid) { + List moduleGroupList = tenantModuleGroupListMap.get(tenantUuid); + if (moduleGroupList == null) { + // 使用master库 + this.setUseMasterDatabase(true); + List tenantModuleGroupList = moduleMapper.getModuleGroupListByTenantUuid(tenantUuid); + // 还原回租户库 + this.setUseMasterDatabase(false); + tenantModuleGroupListMap.put(tenantUuid, tenantModuleGroupList); + } + return tenantModuleGroupListMap.get(tenantUuid); + } + public void release() { MDC.remove("tenant"); instance.remove(); @@ -165,28 +161,35 @@ public class TenantContext implements Serializable { } public List getActiveModuleList() { - return activeModuleList; + List tenantModuleGroupList = searchModuleGroupList(this.tenantUuid); + return ModuleUtil.getTenantActiveModuleList(tenantModuleGroupList); } public List getActiveModuleGroupList() { + List tenantModuleGroupList = searchModuleGroupList(this.tenantUuid); + List activeModuleGroupList = new ArrayList<>(); + for (String group : tenantModuleGroupList) { + ModuleGroupVo groupVo = ModuleUtil.getModuleGroup(group); + if (groupVo != null) { + activeModuleGroupList.add(groupVo); + } + } return activeModuleGroupList; } - public void setActiveModuleList(List activeModuleList) { - this.activeModuleList = activeModuleList; - activeModuleMap = new HashMap<>(); - if (activeModuleList != null && activeModuleList.size() > 0) { + public Map getActiveModuleMap() { + List tenantModuleGroupList = searchModuleGroupList(this.tenantUuid); + List activeModuleList = ModuleUtil.getTenantActiveModuleList(tenantModuleGroupList); + Map activeModuleMap = new HashMap<>(); + if (CollectionUtils.isNotEmpty(activeModuleList)) { for (ModuleVo module : activeModuleList) { activeModuleMap.put(module.getId(), module); } } - } - - public Map getActiveModuleMap() { return activeModuleMap; } public boolean containsModule(String moduleId) { - return activeModuleMap.containsKey(moduleId); + return getActiveModuleMap().containsKey(moduleId); } }