From 04f54fd47f8814cc33aad106d30c7771aa9a4775 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Wed, 11 Jun 2025 10:51:09 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20axis=E6=BC=8F?= =?UTF-8?q?=E6=B4=9E=EF=BC=8C=E4=BD=BF=E7=94=A8HttpURLConnection=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2axis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1441180573728768]优化TenantContext类 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1441180573728768 --- .../core/ModuleInitializedListenerBase.java | 12 +++-- .../threadlocal/TenantContext.java | 54 ++++++++++++------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java index 081f33d65..3126067ac 100644 --- a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java +++ b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java @@ -28,10 +28,10 @@ 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); + if (TenantContext.get() == null) { + TenantContext.init(); + } + TenantContext.get().setUseMasterDatabase(true); myInit(); } @@ -39,6 +39,10 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen public final void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext c = event.getApplicationContext(); if (c instanceof NeatLogicWebApplicationContext) { + if (TenantContext.get() == null) { + TenantContext.init(); + } + TenantContext.get().setUseMasterDatabase(true); onInitialized((NeatLogicWebApplicationContext) c); } } diff --git a/src/main/java/neatlogic/framework/asynchronization/threadlocal/TenantContext.java b/src/main/java/neatlogic/framework/asynchronization/threadlocal/TenantContext.java index f79188203..daca991c9 100644 --- a/src/main/java/neatlogic/framework/asynchronization/threadlocal/TenantContext.java +++ b/src/main/java/neatlogic/framework/asynchronization/threadlocal/TenantContext.java @@ -117,26 +117,10 @@ 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.activeModuleList = null; + this.activeModuleGroupList = null; + this.activeModuleMap = null; 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; @@ -146,6 +130,29 @@ public class TenantContext implements Serializable { return instance.get(); } + private void initModule() { + // 使用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); + this.activeModuleMap = new HashMap<>(); + if (activeModuleList != null && activeModuleList.size() > 0) { + for (ModuleVo module : activeModuleList) { + this.activeModuleMap.put(module.getId(), module); + } + } + } + public void release() { MDC.remove("tenant"); instance.remove(); @@ -165,10 +172,16 @@ public class TenantContext implements Serializable { } public List getActiveModuleList() { + if (activeModuleList == null) { + initModule(); + } return activeModuleList; } public List getActiveModuleGroupList() { + if (activeModuleGroupList == null) { + initModule(); + } return activeModuleGroupList; } @@ -183,6 +196,9 @@ public class TenantContext implements Serializable { } public Map getActiveModuleMap() { + if (activeModuleMap == null) { + initModule(); + } return activeModuleMap; } -- Gitee From a965578588f34f0afad1fbbe7b0cda548247c96d Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Wed, 11 Jun 2025 11:37:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E4=BC=98=E5=8C=96Te?= =?UTF-8?q?nantContext=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1441180573728768]优化TenantContext类 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1441180573728768 --- .../core/ModuleInitializedListenerBase.java | 6 -- .../thread/NeatLogicThread.java | 9 +-- .../threadlocal/TenantContext.java | 75 ++++++++----------- 3 files changed, 32 insertions(+), 58 deletions(-) diff --git a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java index 3126067ac..2b4f76bb7 100644 --- a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java +++ b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java @@ -28,9 +28,6 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen @PostConstruct public final void init() { //初始化TenantContext,避免子类使用TenantContext时出现空指针 - if (TenantContext.get() == null) { - TenantContext.init(); - } TenantContext.get().setUseMasterDatabase(true); myInit(); } @@ -39,9 +36,6 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen public final void onApplicationEvent(ContextRefreshedEvent event) { ApplicationContext c = event.getApplicationContext(); if (c instanceof NeatLogicWebApplicationContext) { - if (TenantContext.get() == null) { - TenantContext.init(); - } 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 aab665819..be5147f30 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,9 +116,6 @@ public class TenantContext implements Serializable { public TenantContext switchTenant(String tenantUuid) { if (StringUtils.isNotBlank(tenantUuid)) { this.tenantUuid = tenantUuid; - this.activeModuleList = null; - this.activeModuleGroupList = null; - this.activeModuleMap = null; this.setUseMasterDatabase(false); MDC.put("tenant", tenantUuid); } @@ -127,30 +123,23 @@ public class TenantContext implements Serializable { } public static TenantContext get() { + if (instance.get() == null) { + init(); + } return instance.get(); } - private void initModule() { - // 使用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); - this.activeModuleMap = new HashMap<>(); - if (activeModuleList != null && activeModuleList.size() > 0) { - for (ModuleVo module : activeModuleList) { - this.activeModuleMap.put(module.getId(), module); - } + 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() { @@ -172,37 +161,35 @@ public class TenantContext implements Serializable { } public List getActiveModuleList() { - if (activeModuleList == null) { - initModule(); - } - return activeModuleList; + List tenantModuleGroupList = searchModuleGroupList(this.tenantUuid); + return ModuleUtil.getTenantActiveModuleList(tenantModuleGroupList); } public List getActiveModuleGroupList() { - if (activeModuleGroupList == null) { - initModule(); + 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() { - if (activeModuleMap == null) { - initModule(); - } return activeModuleMap; } public boolean containsModule(String moduleId) { - return activeModuleMap.containsKey(moduleId); + return getActiveModuleMap().containsKey(moduleId); } } -- Gitee From 750d2b0f8577bc8d56e34e2ca125e1ba68b8c9ae Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Wed, 11 Jun 2025 11:39:21 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E4=BC=98=E5=8C=96Te?= =?UTF-8?q?nantContext=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1441180573728768]优化TenantContext类 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1441180573728768 --- .../applicationlistener/core/ModuleInitializedListenerBase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java index 2b4f76bb7..f4bce033d 100644 --- a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java +++ b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java @@ -27,7 +27,6 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen @PostConstruct public final void init() { - //初始化TenantContext,避免子类使用TenantContext时出现空指针 TenantContext.get().setUseMasterDatabase(true); myInit(); } -- Gitee From 17b5e6c61cd5c3619f3c6c1064ca4b067389d866 Mon Sep 17 00:00:00 2001 From: "1437892690@qq.com" <1437892690@qq.com> Date: Wed, 11 Jun 2025 11:52:03 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[=E5=8A=9F=E8=83=BD]=20=E4=BC=98=E5=8C=96Te?= =?UTF-8?q?nantContext=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 关联 #[1441180573728768]优化TenantContext类 http://192.168.0.96:8090/demo/rdm.html#/story-detail/939050947543040/939050947543042/1441180573728768 --- .../core/ModuleInitializedListenerBase.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java index f4bce033d..055867e1f 100644 --- a/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java +++ b/src/main/java/neatlogic/framework/applicationlistener/core/ModuleInitializedListenerBase.java @@ -15,7 +15,6 @@ along with this program. If not, see .*/ package neatlogic.framework.applicationlistener.core; -import neatlogic.framework.asynchronization.threadlocal.TenantContext; import neatlogic.framework.bootstrap.NeatLogicWebApplicationContext; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; @@ -27,7 +26,6 @@ public abstract class ModuleInitializedListenerBase implements ApplicationListen @PostConstruct public final void init() { - TenantContext.get().setUseMasterDatabase(true); myInit(); } @@ -35,7 +33,6 @@ 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); } } -- Gitee