具有多租赁的春季批次

时间:2014-08-26 23:59:58

标签: spring batch-processing spring-batch spring-integration multi-tenant

我们如何定义弹出批处理作业以针对多个租户运行?

我已经设置了每天晚上针对一个数据库模式运行一系列作业。所有作业当前从一个位置读取文件并插入到数据库。批量配置非常基本,我在其中定义了数据源,事务管理器和映射的作业存储库。我的工作将指向此存储库和事务管理器。此外,我目前正在数据库中保存批量元数据信息。

我的新要求是能够针对多个租户运行相同的作业(按顺序执行)。每个租户数据可以存在于相同的数据库服务器中但不同的模式甚至不同的数据库服我的问题是

1)我们是否将所有租户的批次特定元数据信息存储在一个公共数据库中,或者每个租户数据库应该有自己的?

2)我的理解是,我们需要每个租户的数据源,以便特定于此租户的作业可以访问数据库以存储从文件读取的数据。在为该租户执行作业时,Spring批处理存储库是否还应指向当前数据源?

3)我们计划启动所有租户[工作]并行意味着JOB1可以同时为所有租户运行。目前,当这些租户运行时,我仍然不确定如何管理作业存储库,数据源,事务管理,每个租户都关联到不同的数据源。

4)在我的头脑中,我想的是为每个租户复制我现有的配置,并使用自己的工作 - repositoyy指向租户特定的数据源和事务管理器。如果没有其他方法可以动态定义相同的东西,那么这是我要实现的最后一件事。

如果有任何机构已经解决或对如何寻求解决方案有任何想法,请分享。示例配置应该有所帮助。

1 个答案:

答案 0 :(得分:0)

我参与构建了一个SaaS应用程序,你需要做类似但不完全使用Spring Batch的东西。

您的主要想法是:

一个。定义一个master数据库,您可以在其中存储所有配置特定的数据,假设您有一个映射租户名称,信息和数据源配置的表。

湾启动应用程序并读取此数据源并在服务器端维护本地缓存,并将密钥作为租户名称和值作为租户信息(数据源等)

℃。维护一个本地线程,例如:

public class TenantThreadLocalContext
{
    public static final ThreadLocal<TenantInformation> threadLocal = new ThreadLocal<TenantInformation>();

    public static void set(TenantInformation tenantInformation)
    {
        threadLocal.set(tenantInformation);
    }

    public static void unset()
    {
        threadLocal.remove();
    }

    public static TenantInformation get()
    {
        return threadLocal.get();
    }

}

d。每当您启动任何线程开始处理(批处理)时,将此线程设置为本地租户信息,以便每个线程都知道它与哪个租户相关联。

即最后,在数据库处理时,您可以看到该线程具有哪些数据源,您可以使用此数据源建立连接。

如果您正在使用Hibernate,那么您很幸运,因为Hibernate 4已经为您完成了所有这些。请参阅:this。如果您在休眠配置等方面需要帮助,那么我可能也可以帮助您。