繁体   English   中英

具有多租户的 Spring Batch

[英]Spring Batch with multi tenancy

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

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

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

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

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

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

4)在我的头顶上,我所想的是为每个租户复制我现有的配置,并使用自己的 job-repositoyy 指向租户特定的数据源和事务管理器。 如果没有其他方法可以在不重复的情况下动态定义相同的内容,那么这是我要实现的最后一件事。

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

我参与了构建 SaaS 应用程序,您需要在其中执行类似但不完全使用 Spring Batch 的操作。

你的主要想法是:

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

启动你的应用程序并读取这个数据源并在你的服务器端维护一个本地缓存,key作为你的租户名称,value作为租户信息(数据源等)

C。 与您一起在本地维护一个线程,例如:

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. 每当您启动任何线程以开始处理(批处理)时,请使用租户信息在本地设置此线程,以便此线程中的每一个都知道它与哪个租户相关联。

e. 最后在数据库处理的时候你可以看到线程有什么数据源,你可以使用这个数据源来建立连接。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM