如何在Spring调度程序中实现多租户选项?

aydmsdu9  于 2022-11-23  发布在  Spring
关注(0)|答案(3)|浏览(155)

我们已经在我们的应用程序中实现了多租户选项。每个租户都有各自独立的数据库。使用应用程序过滤器,我可以从请求中管理或分配每个租户。同样,我们如何在Spring Boot 调度程序中做到这一点?

@component     
public class scheduler{
    @Scheduled(fixedRate = 5000)
        public void reminderEmail() {
    //how can we fetch the exact data from exact tenant DB?
    //since there is no request how can we get the tenant name for 
     fetching exact tenant db?    
    }
}

请告诉我我们如何才能做到这一点?

kiz8lqtg

kiz8lqtg1#

类似于:

...
public class TenantContext {

    private static final ThreadLocal<String> CONTEXT = new ThreadLocal<>();

    public static void setTenantId(String tenantId) {     
        CONTEXT.set(tenantId);
    }

    public static String getTenantId() {
        return CONTEXT.get();
    }
...
}

那么您的Filter或SpringMVC拦截器就可以在链接请求之前执行此操作:

String tenantId = request.getHeader(TENANT_HEADER_NAME);
TenantContext.setTenantId(tenantId);

并在回来的路上重置它:

TenantContext.setTenantId(null);

要在一个与http请求无关的线程中使用它,只需执行以下操作:

TenantContext.setTenantId("tenant_1");

更多信息请参见我的博客文章Multi-tenant applications using Spring Boot, JPA, Hibernate and Postgres

ftf50wuq

ftf50wuq2#

如果您使用的多租户设置与此链接中的设置类似:https://www.ricston.com/blog/multitenancy-jpa-spring-hibernate-part-1/和/或您具有默认租户。实现此目的最简单的方法是向CurrentTenantIdentifierResolverImpl类添加一个静态方法,该方法可更改没有会话的异步任务的默认租户。这是因为计划任务将始终使用默认租户。

当前租户标识符解析器实现java

private static String DEFAULT_TENANTID = "tenantId1";

public static void setDefaultTenantForScheduledTasks(String tenant) {
    DEFAULT_TENANT = tenant;
}

计划任务.java

@Scheduled(fixedRate=20000)
public void runTasks() { 

    CurrentTenantIdentifierResolverImpl.setDefaultTenantForScheduledTasks("tenantId2");
    //do something
    CurrentTenantIdentifierResolverImpl.setDefaultTenantForScheduledTasks("tenantId1");

}

然后在计划任务完成后再改回来。这就是我们如何完成它的,它符合我们的需要。

mitkmikd

mitkmikd3#

如果您使用请求来确定哪个承租人当前处于活动状态,并使用承租人来确定数据库连接,则不可能从计划任务执行任何涉及数据库的操作,因为计划任务没有承租人ID

相关问题