From 5a2154c1a1876c14e100611a468c2896bb00d25a Mon Sep 17 00:00:00 2001 From: zhangjf Date: Thu, 19 Feb 2026 21:33:51 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AE=80=E5=8C=96=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E9=80=BB=E8=BE=91=EF=BC=8C=E7=9B=B4=E6=8E=A5=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20tenantId=20=E5=8C=B9=E9=85=8D=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:tenantGroup 是 tenantId 的简单转换,造成冗余 tenantGroup = "TENANT_" + tenantId.toUpperCase() 解决方案: 1. 直接使用 tenantId 匹配实例 - 移除 tenantGroup 概念 - 负载均衡器直接匹配 metadata.tenant-id 2. 简化配置 - JWT 只需 tenantId 一个字段 - 实例元数据只有 tenant-id 3. 前端简化 - 请求头只需 X-Tenant-Id - 不再需要 X-Tenant-Group 路由规则: 共享实例: metadata.tenant-id = "" (空) VIP实例: metadata.tenant-id = "VIP_001" 匹配逻辑: 找到匹配实例 → VIP专属,找不到 → 共享实例 --- docker-compose.yml | 12 +-- .../config/TenantRoutingProperties.java | 56 ++-------- .../loadbalancer/TenantAwareLoadBalancer.java | 90 +++++++--------- .../common/nacos/NacosMetadataConfig.java | 32 +++--- .../TenantAwareLoadBalancerTest.java | 99 ++++++++---------- .../config/TenantRoutingProperties.class | Bin 3757 -> 2522 bytes .../TenantAwareLoadBalancer.class | Bin 11490 -> 10891 bytes .../common/nacos/NacosMetadataConfig.class | Bin 2486 -> 2471 bytes ...adbalancer.TenantAwareLoadBalancerTest.xml | 27 ++--- ...adbalancer.TenantAwareLoadBalancerTest.txt | 2 +- .../TenantAwareLoadBalancerTest.class | Bin 6446 -> 5847 bytes fund-sys/src/main/resources/application.yml | 4 +- fund-sys/target/classes/application.yml | 4 +- logs/fund-sys-shared-8100.log | 36 +++++++ logs/fund-sys-tenant-vip001-8101.log | 18 ++++ logs/fund-sys/error.log | 48 +++++++++ logs/fund-sys/info.log | 6 ++ 17 files changed, 238 insertions(+), 196 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 5b5eac5..794354e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -184,8 +184,8 @@ services: REDIS_HOST: redis REDIS_PORT: 6379 JAVA_OPTS: -Xms256m -Xmx512m - # 租户组 - 共享实例(空值,所有租户可用) - TENANT_GROUP: "" + # 租户 ID - 共享实例(空值,所有租户可用) + TENANT_ID: "" ports: - "8100:8100" depends_on: @@ -227,8 +227,8 @@ services: REDIS_HOST: redis REDIS_PORT: 6379 JAVA_OPTS: -Xms256m -Xmx512m - # 租户组 - VIP_001 专属实例 - TENANT_GROUP: "TENANT_VIP_001" + # 租户 ID - VIP_001 专属实例 + TENANT_ID: "VIP_001" ports: - "8101:8101" depends_on: @@ -270,8 +270,8 @@ services: # REDIS_HOST: redis # REDIS_PORT: 6379 # JAVA_OPTS: -Xms256m -Xmx512m - # # 租户组 - VIP_002 专属实例 - # TENANT_GROUP: "TENANT_VIP_002" + # # 租户 ID - VIP_002 专属实例 + # TENANT_ID: "VIP_002" # ports: # - "8102:8102" # depends_on: diff --git a/fund-common/src/main/java/com/fundplatform/common/config/TenantRoutingProperties.java b/fund-common/src/main/java/com/fundplatform/common/config/TenantRoutingProperties.java index 3e5e514..cf5b29b 100644 --- a/fund-common/src/main/java/com/fundplatform/common/config/TenantRoutingProperties.java +++ b/fund-common/src/main/java/com/fundplatform/common/config/TenantRoutingProperties.java @@ -9,17 +9,17 @@ import java.util.List; /** * 多租户路由配置属性 * - *

租户路由基于 Nacos 服务实例的 metadata.tenant-group 元数据进行匹配

+ *

租户路由基于 Nacos 服务实例的 metadata.tenant-id 元数据进行匹配

* *

工作原理:

*
- * 1. 服务实例注册到 Nacos 时,在 metadata 中声明 tenant-group
- *    - 共享实例: tenant-group 为空或不存在
- *    - VIP 实例: tenant-group = "TENANT_VIP_001"
+ * 1. 服务实例注册到 Nacos 时,在 metadata 中声明 tenant-id
+ *    - 共享实例: tenant-id 为空或不存在
+ *    - VIP 实例: tenant-id = "VIP_001"
  * 
- * 2. Gateway 从请求中提取租户组,负载均衡器匹配实例元数据
- *    - 请求 tenantGroup = "TENANT_VIP_001" → 路由到匹配的 VIP 实例
- *    - 无匹配实例 → 回退到共享实例
+ * 2. 负载均衡器根据请求中的 tenantId 匹配实例
+ *    - 找到匹配的 tenant-id → VIP 专属实例
+ *    - 找不到 → 回退到共享实例
  * 
* *

配置示例:

@@ -28,11 +28,7 @@ import java.util.List; * routing: * enabled: true * tenant-header: X-Tenant-Id - * default-tenant-id: "1" * fallback-to-shared: true - * shared-services: - * - fund-gateway - * - fund-report * */ @Component @@ -45,12 +41,6 @@ public class TenantRoutingProperties { /** 租户 ID 请求头 */ private String tenantHeader = "X-Tenant-Id"; - /** 租户组请求头 */ - private String tenantGroupHeader = "X-Tenant-Group"; - - /** 服务组分隔符 */ - private String groupSeparator = "TENANT_"; - /** 默认租户 ID(当未指定时使用) */ private String defaultTenantId = "1"; @@ -80,22 +70,6 @@ public class TenantRoutingProperties { this.tenantHeader = tenantHeader; } - public String getTenantGroupHeader() { - return tenantGroupHeader; - } - - public void setTenantGroupHeader(String tenantGroupHeader) { - this.tenantGroupHeader = tenantGroupHeader; - } - - public String getGroupSeparator() { - return groupSeparator; - } - - public void setGroupSeparator(String groupSeparator) { - this.groupSeparator = groupSeparator; - } - public String getDefaultTenantId() { return defaultTenantId; } @@ -120,24 +94,8 @@ public class TenantRoutingProperties { this.fallbackToShared = fallbackToShared; } - /** - * 构建租户组名称 - * - * @param tenantId 租户 ID - * @return 租户组名称,如 "TENANT_VIP_001" - */ - public String buildTenantGroup(String tenantId) { - if (tenantId == null || tenantId.isEmpty()) { - return "DEFAULT"; - } - return getGroupSeparator() + tenantId.toUpperCase(); - } - /** * 判断是否为共享服务 - * - * @param serviceName 服务名 - * @return 是否为共享服务 */ public boolean isSharedService(String serviceName) { return sharedServices != null && sharedServices.contains(serviceName); diff --git a/fund-common/src/main/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.java b/fund-common/src/main/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.java index ff778f8..9f530a3 100644 --- a/fund-common/src/main/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.java +++ b/fund-common/src/main/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.java @@ -24,17 +24,21 @@ import java.util.stream.Collectors; * *

根据租户 ID 进行服务实例路由,支持:

* * - *

使用场景

+ *

路由规则:

*
- * 混合模式部署:
- * - VIP 客户:独立部署服务实例(带 tenant-group 标签)
- * - 普通客户:共享服务实例(无 tenant-group 标签)
+ * 1. 查找 metadata.tenant-id == 请求.tenantId 的实例 → VIP 专属实例
+ * 2. 找不到 → 回退到共享实例(metadata.tenant-id 为空)
+ * 
+ * + *

实例配置:

+ *
+ * 共享实例: metadata.tenant-id = "" (空)
+ * VIP 实例: metadata.tenant-id = "VIP_001"
  * 
*/ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalancer { @@ -61,9 +65,8 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc return getDefaultResponse(); } - // 从请求上下文获取租户信息 + // 从请求上下文获取租户 ID String tenantId = getTenantIdFromRequest(request); - String tenantGroup = buildTenantGroup(tenantId); if (supplierProvider == null) { logger.warn("[TenantLB] ServiceInstanceListSupplier 未提供"); @@ -77,7 +80,7 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc } return supplier.get().next() - .map(instances -> filterByTenantGroup(instances, tenantGroup)) + .map(instances -> filterByTenantId(instances, tenantId)) .map(this::getInstanceResponse); } @@ -123,34 +126,20 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc } /** - * 构建租户组名称 - */ - String buildTenantGroup(String tenantId) { - if (routingProperties != null) { - return routingProperties.buildTenantGroup(tenantId); - } - // 默认逻辑 - if (tenantId == null || tenantId.isEmpty()) { - return "DEFAULT"; - } - return "TENANT_" + tenantId.toUpperCase(); - } - - /** - * 根据租户组过滤服务实例 + * 根据租户 ID 过滤服务实例 * *

路由策略:

*
    - *
  1. 优先选择租户专属实例(metadata.tenant-group 匹配)
  2. - *
  3. 回退到共享实例(无 tenant-group 标签)
  4. + *
  5. 优先选择租户专属实例(metadata.tenant-id 匹配)
  6. + *
  7. 回退到共享实例(metadata.tenant-id 为空或不存在)
  8. *
*/ - List filterByTenantGroup(List instances, String tenantGroup) { + List filterByTenantId(List instances, String tenantId) { if (instances == null || instances.isEmpty()) { return instances; } - logger.debug("[TenantLB] 租户组:{},候选实例数:{}", tenantGroup, instances.size()); + logger.debug("[TenantLB] 租户 ID:{},候选实例数:{}", tenantId, instances.size()); // 检查是否为共享服务(不需要租户路由) if (routingProperties != null && routingProperties.isSharedService(serviceId)) { @@ -159,22 +148,24 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc } // 优先选择租户专属实例 - List tenantInstances = instances.stream() - .filter(inst -> { - Map metadata = inst.getMetadata(); - if (metadata == null) return false; - String instanceGroup = metadata.get("tenant-group"); - boolean match = tenantGroup.equals(instanceGroup); - if (match) { - logger.debug("[TenantLB] 匹配租户实例:{}:{}", inst.getHost(), inst.getPort()); - } - return match; - }) - .collect(Collectors.toList()); - - if (!tenantInstances.isEmpty()) { - logger.info("[TenantLB] 找到 {} 个租户专属实例,租户组:{}", tenantInstances.size(), tenantGroup); - return tenantInstances; + if (tenantId != null && !tenantId.isEmpty()) { + List tenantInstances = instances.stream() + .filter(inst -> { + Map metadata = inst.getMetadata(); + if (metadata == null) return false; + String instanceTenantId = metadata.get("tenant-id"); + boolean match = tenantId.equals(instanceTenantId); + if (match) { + logger.debug("[TenantLB] 匹配租户专属实例:{}:{}", inst.getHost(), inst.getPort()); + } + return match; + }) + .collect(Collectors.toList()); + + if (!tenantInstances.isEmpty()) { + logger.info("[TenantLB] 找到 {} 个租户专属实例,租户 ID:{}", tenantInstances.size(), tenantId); + return tenantInstances; + } } // 检查是否启用回退到共享实例 @@ -188,11 +179,11 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc return List.of(); } - // 回退到共享实例(无 tenant-group 标签) + // 回退到共享实例(metadata.tenant-id 为空或不存在) List sharedInstances = instances.stream() .filter(inst -> { Map metadata = inst.getMetadata(); - return metadata == null || !metadata.containsKey("tenant-group"); + return metadata == null || metadata.get("tenant-id") == null || metadata.get("tenant-id").isEmpty(); }) .collect(Collectors.toList()); @@ -209,10 +200,9 @@ public class TenantAwareLoadBalancer implements ReactorServiceInstanceLoadBalanc return new EmptyResponse(); } - // 随机选择 int index = ThreadLocalRandom.current().nextInt(instances.size()); ServiceInstance chosen = instances.get(index); - logger.info("[TenantLB] 选择实例:{}:{} (index={})", chosen.getHost(), chosen.getPort(), index); + logger.info("[TenantLB] 选择实例:{}:{}", chosen.getHost(), chosen.getPort()); return new DefaultResponse(chosen); } diff --git a/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java b/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java index aca6d9f..71b7f0c 100644 --- a/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java +++ b/fund-common/src/main/java/com/fundplatform/common/nacos/NacosMetadataConfig.java @@ -13,21 +13,21 @@ import java.util.Map; /** * Nacos 服务注册元数据配置 * - *

服务启动时自动注册租户组标签到 Nacos,支持租户感知的负载均衡

+ *

服务启动时自动注册租户 ID 到 Nacos,支持租户感知的负载均衡

* - *

租户组配置规则:

+ *

租户 ID 配置规则:

*
- * 共享实例: tenant-group 为空(或不配置)→ 所有租户都可使用
- * VIP实例:  tenant-group = "TENANT_VIP_001" → 仅该租户组可用
+ * 共享实例: tenant-id 为空(或不配置)→ 所有租户都可使用
+ * VIP实例:  tenant-id = "VIP_001" → 仅该租户可用
  * 
* *

配置方式:

*
  * # 方式1: 环境变量(Docker/K8s 推荐)
- * TENANT_GROUP=TENANT_VIP_001
+ * TENANT_ID=VIP_001
  * 
  * # 方式2: 配置文件
- * spring.cloud.nacos.discovery.metadata.tenant-group=TENANT_VIP_001
+ * spring.cloud.nacos.discovery.metadata.tenant-id=VIP_001
  * 
*/ @Configuration @@ -40,11 +40,11 @@ public class NacosMetadataConfig { private String applicationName; /** - * 租户组,优先级:环境变量 > 配置文件 + * 租户 ID,优先级:环境变量 > 配置文件 * 为空表示共享实例,供所有租户使用 */ - @Value("${TENANT_GROUP:${spring.cloud.nacos.discovery.metadata.tenant-group:}}") - private String tenantGroup; + @Value("${TENANT_ID:${spring.cloud.nacos.discovery.metadata.tenant-id:}}") + private String tenantId; private final Registration registration; @@ -57,21 +57,21 @@ public class NacosMetadataConfig { if (registration != null && registration.getMetadata() != null) { Map metadata = registration.getMetadata(); - // 添加租户组元数据 - if (tenantGroup != null && !tenantGroup.isEmpty()) { - metadata.put("tenant-group", tenantGroup); - logger.info("[Nacos] {} 注册为 VIP 专属实例,租户组:{}", applicationName, tenantGroup); + // 添加租户 ID 元数据 + if (tenantId != null && !tenantId.isEmpty()) { + metadata.put("tenant-id", tenantId); + logger.info("[Nacos] {} 注册为 VIP 专属实例,租户 ID:{}", applicationName, tenantId); } else { logger.info("[Nacos] {} 注册为共享实例,供所有租户使用", applicationName); } } } - public String getTenantGroup() { - return tenantGroup; + public String getTenantId() { + return tenantId; } public boolean isVipInstance() { - return tenantGroup != null && !tenantGroup.isEmpty(); + return tenantId != null && !tenantId.isEmpty(); } } diff --git a/fund-common/src/test/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.java b/fund-common/src/test/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.java index 6156114..90cacc7 100644 --- a/fund-common/src/test/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.java +++ b/fund-common/src/test/java/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.java @@ -4,13 +4,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.cloud.client.DefaultServiceInstance; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.loadbalancer.Request; -import org.springframework.cloud.client.loadbalancer.RequestData; import java.util.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; /** * 租户负载均衡器测试 @@ -25,73 +22,70 @@ class TenantAwareLoadBalancerTest { } @Test - void testBuildTenantGroup() { - // 测试租户组名称构建 - String group1 = invokeBuildTenantGroup(loadBalancer, "1"); - assertEquals("TENANT_1", group1); - - String group2 = invokeBuildTenantGroup(loadBalancer, "tenant_001"); - assertEquals("TENANT_TENANT_001", group2); - - String group3 = invokeBuildTenantGroup(loadBalancer, null); - assertEquals("DEFAULT", group3); - - String group4 = invokeBuildTenantGroup(loadBalancer, ""); - assertEquals("DEFAULT", group4); - } - - @Test - void testFilterByTenantGroup() { + void testFilterByTenantId() { // 创建测试实例 List instances = Arrays.asList( - createInstance("fund-sys", "192.168.1.1", 8100, Map.of("tenant-group", "TENANT_1")), - createInstance("fund-sys", "192.168.1.2", 8101, Map.of("tenant-group", "TENANT_1")), - createInstance("fund-sys", "192.168.1.3", 8102, Map.of("tenant-group", "TENANT_2")), + createInstance("fund-sys", "192.168.1.1", 8100, Map.of("tenant-id", "VIP_001")), + createInstance("fund-sys", "192.168.1.2", 8101, Map.of("tenant-id", "VIP_001")), + createInstance("fund-sys", "192.168.1.3", 8102, Map.of("tenant-id", "VIP_002")), createInstance("fund-sys", "192.168.1.4", 8103, Collections.emptyMap()) // 共享实例 ); - // 测试租户 1 过滤 - List tenant1Instances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_1"); - assertEquals(2, tenant1Instances.size()); - assertTrue(tenant1Instances.stream().allMatch(i -> "TENANT_1".equals(i.getMetadata().get("tenant-group")))); + // 测试 VIP_001 过滤 + List vip1Instances = invokeFilterByTenantId(loadBalancer, instances, "VIP_001"); + assertEquals(2, vip1Instances.size()); + assertTrue(vip1Instances.stream().allMatch(i -> "VIP_001".equals(i.getMetadata().get("tenant-id")))); - // 测试租户 2 过滤 - List tenant2Instances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_2"); - assertEquals(1, tenant2Instances.size()); + // 测试 VIP_002 过滤 + List vip2Instances = invokeFilterByTenantId(loadBalancer, instances, "VIP_002"); + assertEquals(1, vip2Instances.size()); // 测试未知租户(回退到共享实例) - List unknownTenantInstances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_UNKNOWN"); - assertEquals(1, unknownTenantInstances.size()); - assertFalse(unknownTenantInstances.get(0).getMetadata().containsKey("tenant-group")); + List unknownInstances = invokeFilterByTenantId(loadBalancer, instances, "VIP_999"); + assertEquals(1, unknownInstances.size()); + assertFalse(unknownInstances.get(0).getMetadata().containsKey("tenant-id")); } @Test void testMixedMode() { // 混合模式:VIP 客户有专属实例,普通客户使用共享实例 List instances = Arrays.asList( - // VIP 租户 001 的专属实例 - createInstance("fund-sys", "192.168.1.1", 8100, Map.of("tenant-group", "TENANT_VIP_001")), - createInstance("fund-sys", "192.168.1.2", 8101, Map.of("tenant-group", "TENANT_VIP_001")), - // VIP 租户 002 的专属实例 - createInstance("fund-sys", "192.168.1.3", 8102, Map.of("tenant-group", "TENANT_VIP_002")), + // VIP_001 的专属实例 + createInstance("fund-sys", "192.168.1.1", 8100, Map.of("tenant-id", "VIP_001")), + createInstance("fund-sys", "192.168.1.2", 8101, Map.of("tenant-id", "VIP_001")), + // VIP_002 的专属实例 + createInstance("fund-sys", "192.168.1.3", 8102, Map.of("tenant-id", "VIP_002")), // 共享实例(普通租户使用) createInstance("fund-sys", "192.168.1.10", 8110, Collections.emptyMap()), createInstance("fund-sys", "192.168.1.11", 8111, Collections.emptyMap()) ); - // VIP 租户 001 应该路由到专属实例 - List vip1Instances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_VIP_001"); + // VIP_001 应该路由到专属实例 + List vip1Instances = invokeFilterByTenantId(loadBalancer, instances, "VIP_001"); assertEquals(2, vip1Instances.size()); - // VIP 租户 002 应该路由到专属实例 - List vip2Instances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_VIP_002"); + // VIP_002 应该路由到专属实例 + List vip2Instances = invokeFilterByTenantId(loadBalancer, instances, "VIP_002"); assertEquals(1, vip2Instances.size()); // 普通租户应该路由到共享实例 - List normalInstances = invokeFilterByTenantGroup(loadBalancer, instances, "TENANT_NORMAL"); + List normalInstances = invokeFilterByTenantId(loadBalancer, instances, "NORMAL_001"); assertEquals(2, normalInstances.size()); } + @Test + void testNullTenantId() { + // 测试空租户 ID(应该回退到共享实例) + List instances = Arrays.asList( + createInstance("fund-sys", "192.168.1.1", 8100, Map.of("tenant-id", "VIP_001")), + createInstance("fund-sys", "192.168.1.2", 8101, Collections.emptyMap()) + ); + + List result = invokeFilterByTenantId(loadBalancer, instances, null); + assertEquals(1, result.size()); + assertFalse(result.get(0).getMetadata().containsKey("tenant-id")); + } + // 辅助方法:创建服务实例 private ServiceInstance createInstance(String serviceId, String host, int port, Map metadata) { return new DefaultServiceInstance( @@ -104,24 +98,13 @@ class TenantAwareLoadBalancerTest { ); } - // 辅助方法:调用私有方法 buildTenantGroup - private String invokeBuildTenantGroup(TenantAwareLoadBalancer lb, String tenantId) { - try { - var method = TenantAwareLoadBalancer.class.getDeclaredMethod("buildTenantGroup", String.class); - method.setAccessible(true); - return (String) method.invoke(lb, tenantId); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - // 辅助方法:调用私有方法 filterByTenantGroup + // 辅助方法:调用私有方法 filterByTenantId @SuppressWarnings("unchecked") - private List invokeFilterByTenantGroup(TenantAwareLoadBalancer lb, List instances, String tenantGroup) { + private List invokeFilterByTenantId(TenantAwareLoadBalancer lb, List instances, String tenantId) { try { - var method = TenantAwareLoadBalancer.class.getDeclaredMethod("filterByTenantGroup", List.class, String.class); + var method = TenantAwareLoadBalancer.class.getDeclaredMethod("filterByTenantId", List.class, String.class); method.setAccessible(true); - return (List) method.invoke(lb, instances, tenantGroup); + return (List) method.invoke(lb, instances, tenantId); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/fund-common/target/classes/com/fundplatform/common/config/TenantRoutingProperties.class b/fund-common/target/classes/com/fundplatform/common/config/TenantRoutingProperties.class index 354ff206da66fbd938719e05d48c3c3ef3dabda8..8c7877f6b785643df745d1b01e2fc18b4c75ed4e 100644 GIT binary patch literal 2522 zcmbVNSyLNF5bn{9SP(2nNK6hV7z=T%iDT!0;9v|kjyQraHl!-4K^lp*rCrtT$Tq(q zzajs@4@p(19979<9`d77`DRuZ((;lQ%}!4rUw41q`sd$2{vx7vI!;oA(cPk3v&s#p zRIhSbcDweq$vVKq>&D-M?pPcWM4d0y=gvj&rqGOt!odGW=eThIX*C01?6mTQcn*|{S| zu?@E*(iEjJgEBNSK#V2~ic=y*Z!sEtwisYs+%Bo7w+%{CDn-|j>#`EOYtR6tlJx$i z$^?m~=sL=w>bzLtQoQ2lDf$RLwZs#3*OMu_fxNV!Y*&HfCe0-&+j6F}U-vwI?i-Y& zd7$UMss^JQ*>Ag24qCA?*He`h1#!`!G!3dR%b;OOp!|8;5xb4rsqhX}=Tw*6BCj5C z&sO)QFecAzbmFu8|D%iQnC)-2xPfwm9cf?4wkVc8Q7stR5%SC}?Q@UUgcKfPW-6jd zjuwx`v(4l*^*T&~zo0`c#ffZJU7C6-iV2qwdTD3EyiYg^&44W(I-0HU-GrR&6J9~X zQH1IBIM&43ai~z(yoak+qXg1b;offm$s{-=kl&svHZH)Gi61mSFZQM@h0wROSKyto(|Pnitv-Dd!lT=MscKGeM?@jIq5oP zE{eSyr-<4p_=>3Yp-*fLePT4BW$5oAykkJ|Z9s-?gx^uzet+Pk4-3a}bEfbc&0f%gQeFC4yS|0rC4?fHp%}Kz0Mc=!ow`mS{i$0}KptlTd1q6ZddK)K${7w^;g;Tx7bHC8|8+=4yNT9xogO#12L_oYsmMW_AnV}H9aWrs*c!6u#GcZ6sFG+E+|wt zrm3Is*p2CaD5e!!g_f#v2h%)i+ly%n!5&_LN%gdiDXB4i8H#DT7t`ZVOl#qorh75% z0@L0Vm=wR-mU1Dp<=JkU<|;WX$a>b9UTMl}BgJEHq6%hEj$klESCFYTt*2;Tx9c0N%_dv? Z-p4&c2l}@_hd491Kf!qfNKbuw_8(v0_lE!g literal 3757 zcmbVP-B%M=5T8v#62eL#BBD}Sts;g(s;y{6QRG8tBT^Gk&{j9eO;|~G*WDY0ephSz z*w=dcFZf{3DYo^T_R)v_Q9b?LyZIv7^q~)O_s*R=^Sd*@nTdb@^Xe}mnx-E@nqzsbT;wjAMVRk)HZ+^%Qq11cv&;b)*Enz%6G`3SFx{Eb3x>waHdE+$)A7Yt zEK|7Blh=yHjF#O@niu})Ixph_JS4AUWn zx^9oT7{?ZK;^>G|{zpYY4h)*Djr-k68 zN?jBV(WyN#cS9JaQ3P6KaIBzl_DI_a(-?qAiOnq2=3z=87*deeivWL`-V4#0sxcX| zY1`Iz9F^Xuvv{)Rh!84tV&qOkoZKW&o@xr^q=0x%C6)GxuMbq}p&)XW)D5;&E@haV z7Mu|IH?vxCRkL-muLuKtLr40~C;uN2MVfVIuF5*(2)v6pjMqegk#&)`p6iTnn7L(8 zs>C?6;WJub6-HHw*EdpmoFsLPqfyv%(^^$LFwzj0ik|S&S2MYX(0w%nd&IramVySV z_d>N<7K7ewa|Ohp*di1bUEV{Ht#2-{SIz|(ATf93UcgW~Nco28x>g=YU= zBJ5aIGQ@OezNG;713{~_CsWpoIX5dZUJ4C+C8ae_5gMU2mDcGp$`0HqSsXQU7n|9+ z`RSEpIsz7ds?s9O3f226X*7$9;^vBl_BW$BEQSu6RVhbc^}&+1$!1I=tMOYp-@uo{ z(J}?6J@B-`@nl?>%g!k}-M$n@Kf112m4b=t&YpZIGYuvhCKArIJCW zLSb}xuIUDV?lDlUa@0|mBg41$r5gCPJ(lj^A)?_OK8YFuz zrV$Je_4X}UcCCtu8Priq=WH?>B+&aC1=C)^q*yczaJZ;Bj+o+4(BoSk=>ZnmE5-+Ib<6K4^f5&6-3uAUEdK7t z?q^t2uujK+qrP}xm-^$efn7Qrj}7k9P(1e5E**=hC)+xxdJqSRh)Iif2IEC`0(K>;YC6?3nSIb9kt6>VAv;LIfd0H zwBtwc!aCH5lrA6!i_${Bt5vZetczGHbQO0y6l?^h8Mt$U*NExx3mi6LN_t|Nqj_kF z$k#EABHqoImf`HNA)-ZKSOz8F= zaXQwF>8>ZH54|xRYsPdRn6x&SL_O3nMI@$=JTVP7W6F7AN_t}&ZpO3$OnMtkqBd)o zx+JFSv;<1HWqLzWqmfq=&De^b*p|T-f5pg6X=E8jUCx7F69S`OR*cJe3m6}^!RYpl z6mGcX7{nT_qgEyAv}a|WZ>~)4iFU=iG8>wRi*g$%ciNy7-K-YL9*Jp{ZdHmaQ+fR0 z=xd6MzNFjFC>Xo*BL0#-!S3EG$`Fabx*_S7t@SbfOYj6CeA?h}u+|C&DKAr3z^wrJ zx_s59ke9AEka4%JS1PUt(5NO}Q%o$Qf6xOTJ)@4mbH9j?>(=dEKQ_109i?&#%Yy9eq!S{sm)65>o&G diff --git a/fund-common/target/classes/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.class b/fund-common/target/classes/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancer.class index 18c4901b32598f16ab20f932475bdef00d31ad79..09a93da7d90a73d9cd1de038a8d0ee98f1405afe 100644 GIT binary patch delta 3990 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 delta 4301 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 diff --git a/fund-common/target/surefire-reports/TEST-com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.xml b/fund-common/target/surefire-reports/TEST-com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.xml index 9c897c6..d2d15a3 100644 --- a/fund-common/target/surefire-reports/TEST-com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.xml +++ b/fund-common/target/surefire-reports/TEST-com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.xml @@ -1,5 +1,5 @@ - + @@ -13,7 +13,7 @@ - + @@ -29,7 +29,7 @@ - + @@ -56,17 +56,20 @@ - - - + - - + + + + \ No newline at end of file diff --git a/fund-common/target/surefire-reports/com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.txt b/fund-common/target/surefire-reports/com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.txt index b17f2d0..0d24cd0 100644 --- a/fund-common/target/surefire-reports/com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.txt +++ b/fund-common/target/surefire-reports/com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest.txt @@ -1,4 +1,4 @@ ------------------------------------------------------------------------------- Test set: com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest ------------------------------------------------------------------------------- -Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.310 s -- in com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest +Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.206 s -- in com.fundplatform.common.loadbalancer.TenantAwareLoadBalancerTest diff --git a/fund-common/target/test-classes/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.class b/fund-common/target/test-classes/com/fundplatform/common/loadbalancer/TenantAwareLoadBalancerTest.class index 45260cce43ce66e6ef47ca1d0f13419ac8de9b4e..ef1af4dd2c4650f910cd3c7d8459e58684c1124e 100644 GIT binary patch literal 5847 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 af92kvNc%J1!Qb$AQe;E@2mXcspyvN`+#ovu literal 6446 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 b%TMv_FO>Zi|G+=-FG|GZ|2O`Nr%>}WWAoZx diff --git a/fund-sys/src/main/resources/application.yml b/fund-sys/src/main/resources/application.yml index c38e6e5..f6b2feb 100644 --- a/fund-sys/src/main/resources/application.yml +++ b/fund-sys/src/main/resources/application.yml @@ -14,9 +14,9 @@ spring: username: nacos password: nacos # 租户路由元数据 - # tenant-group: 空值=共享实例,有值=VIP专属实例 + # tenant-id: 空值=共享实例,有值=VIP专属实例 metadata: - tenant-group: ${TENANT_GROUP:} + tenant-id: ${TENANT_ID:} datasource: driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/fund-sys/target/classes/application.yml b/fund-sys/target/classes/application.yml index c38e6e5..f6b2feb 100644 --- a/fund-sys/target/classes/application.yml +++ b/fund-sys/target/classes/application.yml @@ -14,9 +14,9 @@ spring: username: nacos password: nacos # 租户路由元数据 - # tenant-group: 空值=共享实例,有值=VIP专属实例 + # tenant-id: 空值=共享实例,有值=VIP专属实例 metadata: - tenant-group: ${TENANT_GROUP:} + tenant-id: ${TENANT_ID:} datasource: driver-class-name: com.mysql.cj.jdbc.Driver diff --git a/logs/fund-sys-shared-8100.log b/logs/fund-sys-shared-8100.log index 56db073..87cc114 100644 --- a/logs/fund-sys-shared-8100.log +++ b/logs/fund-sys-shared-8100.log @@ -1138,3 +1138,39 @@ java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBea at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:26:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:26:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:26:06.989 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:31:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:31:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:31:06.988 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) diff --git a/logs/fund-sys-tenant-vip001-8101.log b/logs/fund-sys-tenant-vip001-8101.log index a21e5d3..1bd03c0 100644 --- a/logs/fund-sys-tenant-vip001-8101.log +++ b/logs/fund-sys-tenant-vip001-8101.log @@ -1120,3 +1120,21 @@ java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBea at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:29:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:29:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:29:07.541 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) diff --git a/logs/fund-sys/error.log b/logs/fund-sys/error.log index 97aa294..53e79df 100644 --- a/logs/fund-sys/error.log +++ b/logs/fund-sys/error.log @@ -1518,3 +1518,51 @@ java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBea at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:26:06.989 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:29:07.541 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) +2026-02-19 21:31:06.988 [scheduling-1] [] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task +java.lang.NullPointerException: Cannot invoke "com.zaxxer.hikari.HikariPoolMXBean.getActiveConnections()" because the return value of "com.zaxxer.hikari.HikariDataSource.getHikariPoolMXBean()" is null + at com.fundplatform.sys.config.HikariMonitorConfig.monitorHikariPool(HikariMonitorConfig.java:38) + at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) + at java.base/java.lang.reflect.Method.invoke(Method.java:580) + at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130) + at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124) + at io.micrometer.observation.Observation.observe(Observation.java:499) + at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124) + at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54) + at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) + at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) + at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) + at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) + at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) + at java.base/java.lang.Thread.run(Thread.java:1583) diff --git a/logs/fund-sys/info.log b/logs/fund-sys/info.log index 4362c22..1698e7a 100644 --- a/logs/fund-sys/info.log +++ b/logs/fund-sys/info.log @@ -334,3 +334,9 @@ 2026-02-19 21:21:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool 2026-02-19 21:24:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === 2026-02-19 21:24:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:26:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:26:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:29:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:29:07.541 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool +2026-02-19 21:31:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - === HikariCP 连接池状态 === +2026-02-19 21:31:06.988 [scheduling-1] [] INFO com.fundplatform.sys.config.HikariMonitorConfig - 连接池名称: FundSysHikariPool