Просмотр исходного кода

定时任务:修改调度器,redis配置

yh 4 месяцев назад
Родитель
Сommit
e45cad7bad

+ 13 - 0
fs-admin/src/main/java/com/fs/quartz/saas/TenantJobDispatcherJob.java

@@ -8,6 +8,7 @@ import com.fs.core.config.TenantConfigContext;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
 import com.fs.framework.datasource.TenantDataSourceManager;
 import com.fs.quartz.domain.SysJob;
+import com.fs.quartz.domain.TenantPrincipal;
 import com.fs.quartz.mapper.SysJobMapper;
 import com.fs.quartz.util.CronUtils;
 import com.fs.quartz.util.JobInvokeUtil;
@@ -20,7 +21,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.quartz.Job;
 import org.quartz.JobExecutionContext;
 import org.quartz.JobExecutionException;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
 
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -82,6 +86,15 @@ public class TenantJobDispatcherJob implements Job {
         }
         ProjectConfig.loadTenantConfigsFromContext();
 
+        // 设置租户到 SecurityContext,供 TenantKeyRedisSerializer 自动为 Redis Key 加 tenantid 前缀
+        SecurityContextHolder.getContext().setAuthentication(
+                new UsernamePasswordAuthenticationToken(
+                        new TenantPrincipal(tenant.getId()),
+                        null,
+                        Collections.emptyList()
+                )
+        );
+
         List<SysJob> allJobs = sysJobMapper.selectJobAll();
         if (allJobs == null || allJobs.isEmpty()) {
             return;

+ 3 - 3
fs-company-app/src/main/java/com/fs/app/controller/UserController.java

@@ -251,11 +251,11 @@ public class UserController extends AppBaseController {
         DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.MASTER.name());
 
         // ===== 只有传了 tenantCode 才查询租户并切库 =====
-        String tenantName = param.getTenantCode();
-        if (StringUtils.isNotBlank(tenantName))
+        String tenantCode = param.getTenantCode();
+        if (StringUtils.isNotBlank(tenantCode))
         {
             // 查询租户(主库)
-            tenantInfo = iSysUserService.getTenantInfo(tenantName);
+            tenantInfo = iSysUserService.getTenantInfo(tenantCode);
             if (BeanUtil.isEmpty(tenantInfo)) {
                 throw new ServiceException("企业不存在");
             }

+ 10 - 0
fs-framework/src/main/java/com/fs/framework/config/TenantPrincipal.java

@@ -0,0 +1,10 @@
+package com.fs.framework.config;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TenantPrincipal {
+    private final Long tenantId;
+}

+ 13 - 0
fs-framework/src/main/java/com/fs/framework/task/TenantTaskRunner.java

@@ -5,6 +5,7 @@ import com.fs.common.enums.DataSourceType;
 import com.fs.common.utils.StringUtils;
 import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
+import com.fs.framework.config.TenantPrincipal;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
 import com.fs.framework.datasource.TenantDataSourceManager;
 import com.fs.system.domain.SysConfig;
@@ -12,9 +13,12 @@ import com.fs.system.mapper.SysConfigMapper;
 import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.service.TenantInfoService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.function.Consumer;
@@ -103,6 +107,15 @@ public class TenantTaskRunner {
             }
             ProjectConfig.loadTenantConfigsFromContext();
             action.accept(tenant);
+
+            // 设置租户到 SecurityContext,供 TenantKeyRedisSerializer 自动为 Redis Key 加 tenantid 前缀
+            SecurityContextHolder.getContext().setAuthentication(
+                    new UsernamePasswordAuthenticationToken(
+                            new TenantPrincipal(tenant.getId()),
+                            null,
+                            Collections.emptyList()
+                    )
+            );
         } catch (Exception e) {
             log.error("[SaaS Task] 租户 tenantId={}, tenantCode={} 执行异常", tenant.getId(), tenant.getTenantCode(), e);
         } finally {

+ 10 - 0
fs-quartz/src/main/java/com/fs/quartz/domain/TenantPrincipal.java

@@ -0,0 +1,10 @@
+package com.fs.quartz.domain;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TenantPrincipal {
+    private final Long tenantId;
+}

+ 13 - 16
fs-quartz/src/main/java/com/fs/quartz/util/CronUtils.java

@@ -68,30 +68,27 @@ public class CronUtils
      * @param cronExpression cron 表达式
      * @return 当前分钟内会触发返回 true
      */
-    public static boolean isDueInThisMinute(String cronExpression)
-    {
-        if (cronExpression == null || cronExpression.isEmpty())
-        {
+    public static boolean isDueInThisMinute(String cronExpression) {
+        if (cronExpression == null || cronExpression.isEmpty()) {
             return false;
         }
-        try
-        {
+        try {
             CronExpression cron = new CronExpression(cronExpression);
+
             Calendar cal = Calendar.getInstance();
             cal.set(Calendar.SECOND, 0);
             cal.set(Calendar.MILLISECOND, 0);
+
             Date startOfMinute = cal.getTime();
-            Date next = cron.getNextValidTimeAfter(startOfMinute);
-            if (next == null)
-            {
-                return false;
-            }
             cal.add(Calendar.MINUTE, 1);
-            Date endOfMinute = cal.getTime();
-            return !next.before(startOfMinute) && next.before(endOfMinute);
-        }
-        catch (ParseException e)
-        {
+            Date startOfNextMinute = cal.getTime();
+
+            // 关键:用 startOfMinute 往前挪一点,才能把 “刚好等于 startOfMinute(00秒)” 的触发点算进来
+            Date base = new Date(startOfMinute.getTime() - 1);
+
+            Date next = cron.getNextValidTimeAfter(base);
+            return next != null && !next.before(startOfMinute) && next.before(startOfNextMinute);
+        } catch (ParseException e) {
             return false;
         }
     }

+ 14 - 0
fs-qw-task/src/main/java/com/fs/app/task/TenantTaskRunner.java

@@ -5,6 +5,7 @@ import com.fs.common.enums.DataSourceType;
 import com.fs.common.utils.StringUtils;
 import com.fs.config.saas.ProjectConfig;
 import com.fs.core.config.TenantConfigContext;
+import com.fs.framework.config.TenantPrincipal;
 import com.fs.framework.datasource.DynamicDataSourceContextHolder;
 import com.fs.framework.datasource.TenantDataSourceManager;
 import com.fs.system.domain.SysConfig;
@@ -13,11 +14,14 @@ import com.fs.tenant.domain.TenantInfo;
 import com.fs.tenant.service.TenantInfoService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;
+import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.*;
@@ -180,6 +184,16 @@ public class TenantTaskRunner {
             }
             ProjectConfig.loadTenantConfigsFromContext();
             action.accept(tenant);
+
+            // 设置租户到 SecurityContext,供 TenantKeyRedisSerializer 自动为 Redis Key 加 tenantid 前缀
+            SecurityContextHolder.getContext().setAuthentication(
+                    new UsernamePasswordAuthenticationToken(
+                            new TenantPrincipal(tenant.getId()),
+                            null,
+                            Collections.emptyList()
+                    )
+            );
+
         } catch (Exception e) {
             log.error("[SaaS Task] 租户 tenantId={}, tenantCode={} 执行异常", tenant.getId(), tenant.getTenantCode(), e);
         } finally {

+ 10 - 0
fs-qw-task/src/main/java/com/fs/framework/config/TenantPrincipal.java

@@ -0,0 +1,10 @@
+package com.fs.framework.config;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public class TenantPrincipal {
+    private final Long tenantId;
+}