spring - 如何在 Spring Batch 中创建动态步骤

标签 spring spring-batch

我需要创建“N”个步骤,具体取决于从数据库接收到的“maxHierLevel”值并按顺序执行它们 -

int maxHierLevel = testService.getHighestLevel(); 

Step masterCalculationStep = stepBuilderFactory.get("CALCUL_STEP_1")
        .<Map<Long, List<CostCalculation>>, List<TempCostCalc>>chunk(1)
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .build();

final Step[] stepsArray = new Step[maxHierLevel];

for (int i = 0; i < stepsArray.length; i++) {
    stepsArray [i] = stepBuilderFactory.get("processingRecordsInLevel_"+i)
            .partitioner("partitionningSlavStep_"+i , calculationPartioner(i))
            .step(masterCalculationStep)
            .listener(new StepResultListener())
            .taskExecutor(taskExecutor)
            .build();
}

return jobBuilderFactory.get("mainCalculationJob")
                .incrementer(new RunIdIncrementer())
                .flow(truncTableTaskletStep())
                .next(loadPlantList)
                .next(stepsArray[0]) 
                .next(stepsArray[1])
                .next(stepsArray[2])
                .end()
                .listener(listener)
                .build();

我们可以动态添加像 next(stepsArray[0]) 这样的步骤并返回作业 ref 吗?

最佳答案

是的,您可以动态创建步骤并返回作业引用。以下是您如何在您的案例中执行此操作的示例:

@Bean
public Job job() {
    Step[] stepsArray = // create your steps array or pass it as a parameter
    SimpleJobBuilder jobBuilder = jobBuilderFactory.get("mainCalculationJob")
            .incrementer(new RunIdIncrementer())
            .start(truncTableTaskletStep());
    for (Step step : stepsArray) {
        jobBuilder.next(step);
    }
    return jobBuilder.build();
}

希望这对您有所帮助。

关于spring - 如何在 Spring Batch 中创建动态步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54853908/

相关文章:

java - Spring Boot 应用程序无法在 AWS 上运行 - Tomcat 抛出 UnsatisfiedDependencyExceptions

hibernate - 尝试使用空实体创建 saveOrUpdate 事件

java - Spring为选定端点自动添加 'X-Total-Count' header

java - 结果集元数据作为 Spring 批处理中 CSV 文件的 header

mysql - spring batch - 如何在应用程序运行时传递动态列表到 ListItemReader 将其存储到数据库中

java - 如何跳过 block 中的任何错误并继续下一个 block 项目?

java - 使用 Junit 测试 Spring Singleton 实现

java - 多个 session 工厂,一个连接?

java - 使用 Spring Boot 和 WebSphere 8.5.5 进行远程 EJB 查找

java - 在 Spring 批处理中,我们如何将处理过的文件移动到另一个文件夹,我正在使用 MultiResourceItemReader 和 block 处理