|
|
@@ -66,9 +66,10 @@ public class TenantTaskRunner {
|
|
|
public void runForEachTenant(String taskName, Runnable action) {
|
|
|
List<TenantInfo> tenants = getValidTenants();
|
|
|
if (tenants == null || tenants.isEmpty()) {
|
|
|
- log.debug("[SaaS Live Task] 无有效租户,跳过任务: {}", taskName);
|
|
|
+ log.info("[SaaS Live Task] 无有效租户,跳过任务: {}", taskName);
|
|
|
return;
|
|
|
}
|
|
|
+ log.info("[SaaS Live Task] 开始执行任务={}, 有效租户数={}", taskName, tenants.size());
|
|
|
// 并行提交所有租户任务,等待全部完成
|
|
|
List<Future<?>> futures = new java.util.ArrayList<>(tenants.size());
|
|
|
for (TenantInfo tenant : tenants) {
|
|
|
@@ -97,12 +98,18 @@ public class TenantTaskRunner {
|
|
|
query.setStatus(1);
|
|
|
List<TenantInfo> tenants = tenantInfoService.selectTenantInfoList(query);
|
|
|
if (tenants == null || tenants.isEmpty()) {
|
|
|
+ log.info("[SaaS Live Task] 主库中无status=1的租户");
|
|
|
return Collections.emptyList();
|
|
|
}
|
|
|
Date now = new Date();
|
|
|
- return tenants.stream()
|
|
|
+ List<TenantInfo> valid = tenants.stream()
|
|
|
.filter(t -> t.getExpireTime() == null || !t.getExpireTime().before(now))
|
|
|
.collect(Collectors.toList());
|
|
|
+ log.info("[SaaS Live Task] 租户查询结果: total={}, valid={}", tenants.size(), valid.size());
|
|
|
+ return valid;
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("[SaaS Live Task] 查询租户列表失败", e);
|
|
|
+ return Collections.emptyList();
|
|
|
} finally {
|
|
|
DynamicDataSourceContextHolder.clearDataSourceType();
|
|
|
}
|
|
|
@@ -118,19 +125,25 @@ public class TenantTaskRunner {
|
|
|
|
|
|
// 检查租户是否开通了直播功能(live 表是否有数据)
|
|
|
if (!isLiveModuleEnabled(tenant)) {
|
|
|
- log.error("[SaaS Live Task] 租户 tenantCode={} 未开通直播功能,跳过任务: {}",
|
|
|
+ log.warn("[SaaS Live Task] 租户 tenantCode={} 未开通直播功能,跳过任务: {}",
|
|
|
tenant.getTenantCode(), taskName);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- // 加载租户项目配置
|
|
|
- SysConfig cfg = sysConfigMapper.selectConfigByConfigKey("projectConfig");
|
|
|
- if (cfg != null && StringUtils.isNotBlank(cfg.getConfigValue())) {
|
|
|
- TenantConfigContext.set(JSONObject.parseObject(cfg.getConfigValue()));
|
|
|
- } else {
|
|
|
+ // 加载租户项目配置(容错:租户库可能没有 sys_config 表)
|
|
|
+ try {
|
|
|
+ SysConfig cfg = sysConfigMapper.selectConfigByConfigKey("projectConfig");
|
|
|
+ if (cfg != null && StringUtils.isNotBlank(cfg.getConfigValue())) {
|
|
|
+ TenantConfigContext.set(JSONObject.parseObject(cfg.getConfigValue()));
|
|
|
+ } else {
|
|
|
+ TenantConfigContext.set(null);
|
|
|
+ }
|
|
|
+ ProjectConfig.loadTenantConfigsFromContext();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("[SaaS Live Task] 租户 {} 加载项目配置失败, 使用默认配置: {}",
|
|
|
+ tenant.getTenantCode(), e.getMessage());
|
|
|
TenantConfigContext.set(null);
|
|
|
}
|
|
|
- ProjectConfig.loadTenantConfigsFromContext();
|
|
|
|
|
|
// 设置租户 SecurityContext,让 TenantKeyRedisSerializer 自动拼租户前缀
|
|
|
SecurityContextHolder.getContext().setAuthentication(
|