【发布时间】:2015-09-29 19:39:47
【问题描述】:
我的系统支持多租户,直到现在每个租户都有自己的作业存储库(即在特定于租户的架构下)。 这意味着“myJob”可以为租户 X 和租户 Y 执行,并且可以毫无风险地共享。
执行作业时,它会解析所有参数。这些参数是根据同一作业的最后一次执行(包括租户 ID)来解析的。 我使用 SimpleJobOperator.startNextInstance 的方法,它也用于我的工作。
//Find the last execution
List<JobInstance> lastInstances = jobExplorer.getJobInstances(jobName, 0, 1);
//get the parameters of the last execution
lastInstances.get(0).getJobParameters()
现在提出了一个新要求,所有租户都应维护共享单个数据库模式的作业存储库。这将破坏上面的解决方案,因为我们不确定最后一个实例是否属于当前租户。
一个简单的解决方案是:
List<JobInstance> lastInstances = jobExplorer.getJobInstances(jobName,0,Integer.MAX_VALUE);
for (JobInstance jobInstance : instances) {
if(jobInstance.getJobParameters().getString("TENANT_ID")
.equals(currentTenant)){
tenantLastJobInstance = jobInstance;
break;
}
}
这种丑陋且低效的解决方案,我试图避免上述情况。
理想的解决方案是 myJob 将充当模板并命名实际工作 基于租户,例如myJob+TenantId 的一些变体(myJobX 和 myJobY)。
- 欢迎任何关于如何实施这种方法的想法
- 也欢迎任何创建多租户的替代方法。
【问题讨论】:
-
你能分享一个你第一种方法的例子吗?我在设置租户特定的春季批次时遇到问题。
-
最新版本似乎无法直接从
JobInstance对象获取作业参数。
标签: spring spring-batch multi-tenant