Java 如何使用spring批处理在作业中动态添加步骤

Java 如何使用spring批处理在作业中动态添加步骤,java,spring,spring-batch,Java,Spring,Spring Batch,我使用的是SpringBatch,在这里我有一个使用动态步骤配置作业的用例。步骤的数量取决于用户发送的请求。 目前,我正在使用tasklet方法来处理该步骤 我不想分块处理数据 任何解决此问题的方法,以便我可以使用动态步骤配置作业 请从JobConfiguration中查找代码段 @Bean public Job createBatchJob() { return jobFactory.get(JOB_TYPE) .preventRestart()

我使用的是SpringBatch,在这里我有一个使用动态步骤配置作业的用例。步骤的数量取决于用户发送的请求。 目前,我正在使用tasklet方法来处理该步骤

我不想分块处理数据

任何解决此问题的方法,以便我可以使用动态步骤配置作业

请从JobConfiguration中查找代码段

@Bean
public Job createBatchJob() {
    return jobFactory.get(JOB_TYPE)
            .preventRestart()
            .start(step1())
            .build();
}

@Bean
public Step step1() {
    return stepFactory.get(STEP_TYPE)
    .tasklet(batchTasklet).build();
}

如何在上述配置中配置动态步骤?

这是另一种情况,并非完全相同

基本上,我们需要动态的步骤,但是在构建作业之后,要将其惰性地添加到作业中

假设我配置了一个作业来处理一些文件。 但是用户请求一个批处理并可以提交多个文件,现在根据用户通过RESTAPI提交的文件数量,我想将这些步骤添加到创建的作业中

是否支持在作业生成后向其添加步骤

或者是否有一种方法可以动态创建作业配置

// Skip the first input that already added in start step above.
for(int i = 1; i < inputs.size(); i++) {
    jobBuilder.next(new GenericTaskletStep(TASKLET_STEP_NAME))
}

// Finally build your job
jobBuilder.build();

希望这能澄清问题。

这是一个不同的情况,而不是完全相同的情况

基本上,我们需要动态的步骤,但是在构建作业之后,要将其惰性地添加到作业中

假设我配置了一个作业来处理一些文件。 但是用户请求一个批处理并可以提交多个文件,现在根据用户通过RESTAPI提交的文件数量,我想将这些步骤添加到创建的作业中

是否支持在作业生成后向其添加步骤

或者是否有一种方法可以动态创建作业配置

// Skip the first input that already added in start step above.
for(int i = 1; i < inputs.size(); i++) {
    jobBuilder.next(new GenericTaskletStep(TASKLET_STEP_NAME))
}

// Finally build your job
jobBuilder.build();
希望这能澄清问题。

您需要使用

SimpleJobBuilder

您可以编写自己的genericGenericTaskletStep类,该类接受用户输入进行批处理。将批处理逻辑嵌入到该泛型类中。然后迭代输入并动态添加GenericTaskletStep

// Skip the first input that already added in start step above.
for(int i = 1; i < inputs.size(); i++) {
    jobBuilder.next(new GenericTaskletStep(TASKLET_STEP_NAME))
}

// Finally build your job
jobBuilder.build();
//跳过上面开始步骤中已添加的第一个输入。
对于(int i=1;i
您需要使用

SimpleJobBuilder

您可以编写自己的genericGenericTaskletStep类,该类接受用户输入进行批处理。将批处理逻辑嵌入到该泛型类中。然后迭代输入并动态添加GenericTaskletStep

// Skip the first input that already added in start step above.
for(int i = 1; i < inputs.size(); i++) {
    jobBuilder.next(new GenericTaskletStep(TASKLET_STEP_NAME))
}

// Finally build your job
jobBuilder.build();
//跳过上面开始步骤中已添加的第一个输入。
对于(int i=1;i
可能的重复是另一种情况,而不是如何在Spring Batch中创建动态步骤的完全重复。基本上,我们需要动态的步骤,但是在构建作业之后,要将其惰性地添加到作业中。假设我配置了一个作业来处理一些文件。但是用户请求一个批处理并可以提交多个文件,现在根据用户通过RESTAPI提交的文件数量,我想将这些步骤添加到创建的作业中。是否支持在作业生成后向其添加步骤?或者是否有一种方法可以动态创建作业配置。希望这能澄清问题。如果我理解正确,作业定义是动态的,取决于请求参数。这是一个Spring问题,而不是Spring批处理问题,您正在尝试动态创建bean(作业/步骤bean)。您可能需要在控制器中注入bean注册表,并在运行时更新作业/步骤bean(请参见此处:)。从概念上讲,我们的作业配置只有一个,但每次执行都有多个步骤。我们可以使用块处理来实现这一点吗?块大小为1的自定义itemReader。每个区块可以并行处理吗?可能的重复是不同的情况,而不是如何在SpringBatch中创建动态步骤的完全重复。基本上,我们需要动态的步骤,但是在构建作业之后,要将其惰性地添加到作业中。假设我配置了一个作业来处理一些文件。但是用户请求一个批处理并可以提交多个文件,现在根据用户通过RESTAPI提交的文件数量,我想将这些步骤添加到创建的作业中。是否支持在作业生成后向其添加步骤?或者是否有一种方法可以动态创建作业配置。希望这能澄清问题。如果我理解正确,作业定义是动态的,取决于请求参数。这是一个Spring问题,而不是Spring批处理问题,您正在尝试动态创建bean(作业/步骤bean)。您可能需要在控制器中注入bean注册表,并在运行时更新作业/步骤bean(请参见此处:)。从概念上讲,我们的作业配置只有一个,但每次执行都有多个步骤。我们可以使用块处理来实现这一点吗?块大小为1的自定义itemReader。可以并行处理每个数据块吗?这样做的原因是我们希望单独跟踪每个文件的处理情况并报告状态,因此步骤是自然选择。这样做的原因是我们希望单独跟踪每个文件的处理情况并报告状态,因此步骤是自然选择。