xxl定时器任务,数据库查询MP无法拼接租户条件

Blade 未结 1 301
南希
南希 剑童 2024-01-30 11:03

一、该问题的重现步骤是什么?

xxl-job定时器任务,怎么设置 token,现象


@XxlJob("asyncReceivingSendInspection")
public void asyncReceivingSendInspection()

    数据库操作查询时,没有拼接租户

二、你期待的结果是什么?实际看到的又是什么?

怎么实现定时器查询等操作时,拼接上租户信息,因为有多租户,定时任务,无法数据隔离,我看bladex-tool也没有封装此块解决方案

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

BladeX-Tool
org.springblade2.9.0.RELEASE

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

我们公司买的项目版本啊。请帮忙给予支持


1条回答
  • 可以写个TenantJob注解,然后写个AOP拦截该注解执行任务,任务执行时,会按照租户逐个设置租户id执行 Job 的逻辑。

    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface TenantJob {
    }
    @Aspect
    @RequiredArgsConstructor
    @Slf4j
    public class TenantJobAspect {
    
        private final TenantFrameworkService tenantFrameworkService;
    
        @Around("@annotation(tenantJob)")
        public String around(ProceedingJoinPoint joinPoint, TenantJob tenantJob) {
            // 获得租户列表
            List<Long> tenantIds = tenantFrameworkService.getTenantIds();
            if (CollUtil.isEmpty(tenantIds)) {
                return null;
            }
    
            // 逐个租户,执行 Job
            Map<Long, String> results = new ConcurrentHashMap<>();
            tenantIds.parallelStream().forEach(tenantId -> {
                TenantUtils.execute(tenantId, () -> {
                    try {
                        joinPoint.proceed();
                    } catch (Throwable e) {
                        results.put(tenantId, ExceptionUtil.getRootCauseMessage(e));
                    }
                });
            });
            return JsonUtils.toJsonString(results);
        }
    
    }


    作者追问:2024-01-30 14:12

    感谢回复

    0 讨论(0)
提交回复