我们如何定义针对多个租户运行的 Spring 批处理作业?
我已经设置为每晚针对一个数据库模式按顺序运行一系列作业。当前所有作业都从某个位置读取文件并插入到数据库。批处理配置非常基本,我在其中定义了数据源、事务管理器并将作业存储库映射到它。我的工作将指向这个存储库和事务管理器。另外,我目前正在数据库中保存批处理元数据信息。
我的新要求是能够针对多个租户运行相同的作业(按顺序执行)。每个租户的数据可以驻留在同一数据库服务器但不同的模式甚至不同的数据库服务器中。我的问题是
1)我们是否将所有租户的批次特定元数据信息存储在一个公共数据库中,还是每个租户数据库都应该有自己的数据库?
2)我的理解是,我们需要每个租户一个数据源,以便特定于该租户的作业可以访问数据库来存储从文件读取的数据。在为该租户执行作业时,Spring Batch 存储库是否也应该指向当前数据源?
3) 我们计划并行启动所有租户[作业],这意味着 JOB1 可以同时为所有租户运行。目前,我仍然不确定当这些租户运行时每个租户都与不同的数据源相关联时如何管理作业存储库、数据源、事务管理。
4)在我的脑海中,我所想的就是为每个租户复制现有的配置,并使用自己的作业存储库指向租户特定的数据源和事务管理器。如果没有其他方法可以动态定义相同的内容而无需重复,这是我要实现的最后一件事。
如果任何机构已经解决或对如何找到解决方案有任何想法,请分享。示例配置应该有所帮助。
我参与构建了一个 SaaS 应用程序,您需要在其中执行类似但不完全使用 Spring Batch 的操作。
您的主要想法是:
A。定义一个主数据库,您将在其中存储所有配置特定数据,假设您有一个映射租户名称、信息和数据源配置的表。
b.启动您的应用程序并读取此数据源,并在服务器端维护本地缓存,其中键为您的租户名称,值作为租户信息(数据源等)
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 已经为您完成了这一切。参考:this http://docs.jboss.org/hibernate/orm/4.1/devguide/en-US/html/ch16.html。如果您需要休眠配置等方面的帮助,那么我可能也可以帮助您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)