我们如何定义春季批处理作业以针对多个租户运行?
我已设置为每天晚上针对当前一个数据库模式按顺序运行一系列作业。当前所有作业都从某个位置读取文件并插入到数据库中。批处理配置非常基本,其中定义了数据源,事务管理器并将其映射到作业库。我的工作将指向此存储库和事务管理器。另外,我目前正在将批处理元数据信息保留在数据库中。
我的新要求是能够对多个租户运行相同的作业(按顺序执行)。每个租户数据可以位于同一数据库服务器中,但可以位于不同的架构甚至不同的数据库服务器中。我的问题是
1)我们是否将所有租户的批次特定元数据信息存储在一个公共数据库中,或者每个租户数据库都应该有自己的批处理元数据信息?
2)我的理解是,我们需要每个租户一个数据源,以便该租户特定的作业将有权访问数据库以存储从文件读取的数据。在为该承租人执行作业时,spring batch存储库是否也应指向当前数据源?
3)我们计划并行启动所有租户[职位],这意味着所有租户都可以同时运行JOB1。目前,我仍然不确定当这些租户运行且每个租户关联到不同的数据源时如何管理作业库,数据源,事务管理。
4)在我的头上,我想做的就是为每个租户复制我现有的配置,并拥有自己的工作仓库,指向租户特定的数据源和事务管理器。如果没有其他方法可以动态地定义相同的对象而不进行复制,这将是我要实现的最后一件事。
如果有任何机构解决或对解决方案有任何想法,请分享。一个示例配置应该会有所帮助。
我参与了一个SaaS应用程序的构建,在该应用程序中您需要执行类似但并非完全使用Spring Batch的操作。
您的主要想法是:
一种。定义一个主数据库,您将在其中存储所有配置特定的数据,假设您有一个表,该表映射了您的租户名称,信息和数据源配置。
b。启动您的应用程序并读取此数据源,并在服务器端维护本地缓存,并使用key作为您的租户名称,并使用值作为租户信息(数据源等)。
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。如果您在休眠配置等方面需要帮助,那么也许我也可以为您提供帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句