spring批处理中的多租户作业存储库

spring批处理中的多租户作业存储库,spring,spring-batch,multi-tenant,Spring,Spring Batch,Multi Tenant,我的系统支持多租户,到目前为止,每个租户都有自己的作业存储库(即在特定于租户的架构下)。 意思是“myJob”可以为租户X和租户Y执行,并且可以在没有任何风险的情况下共享 执行作业时,它会解析所有参数。参数基于同一作业(包括租户Id)的最后一次执行进行解析。 我已经从SimpleJoboOperator.startNumeristance获得了这种方法,它也用于我的工作 //Find the last execution List<JobInstance> lastInstances

我的系统支持多租户,到目前为止,每个租户都有自己的作业存储库(即在特定于租户的架构下)。 意思是“myJob”可以为租户X和租户Y执行,并且可以在没有任何风险的情况下共享

执行作业时,它会解析所有参数。参数基于同一作业(包括租户Id)的最后一次执行进行解析。 我已经从SimpleJoboOperator.startNumeristance获得了这种方法,它也用于我的工作

//Find the last execution
List<JobInstance> lastInstances = jobExplorer.getJobInstances(jobName, 0, 1); 
//get the parameters of the last execution
lastInstances.get(0).getJobParameters()
//查找最后一次执行
List lastInstances=jobExplorer.getJobInstances(jobName,0,1);
//获取上次执行的参数
lastInstances.get(0).getJobParameters()
现在提出了一个新的要求,所有租户都应该维护共享单个db模式的作业存储库。这将破坏上述解决方案,因为我们不确定最后一个实例是否属于当前租户。
天真的解决方法是:

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;
        }
}
List lastInstances=jobExplorer.getJobInstances(jobName,0,Integer.MAX_值);
例如(JobInstance JobInstance:instances){
if(jobInstance.getJobParameters().getString(“租户ID”)
.equals(当前租户)){
tenantLastJobInstance=jobInstance;
打破
}
}
这是一个丑陋且低效的解决方案,我正试图避免上述情况

理想的解决方案是myJob作为模板,并命名为实际的job 基于租户,例如myJob+TenantId的一些变体(myJobX和myJobY)

  • 任何关于如何实施这种方法的想法都将受到欢迎
  • 任何创建多租户的替代方法也将受到欢迎
在我的脑海中(我没有考虑太多),我建议扩展SimpleJobExplorer,并添加一个自定义方法来基于租户id进行查询。虽然这会让您稍微远离“标准”实现,这是解决IMHO需求的最简单的方法。

您能分享一下您的第一种方法吗?我在设置租户特定的spring批处理时遇到问题。在最新版本中,似乎不可能直接从
JobInstance
对象获取作业参数。