【问题标题】:Dynamic step creationin Spring Batch using custom parameter for decision making在 Spring Batch 中使用自定义参数创建动态步骤以进行决策
【发布时间】:2020-07-21 16:08:21
【问题描述】:

Spring Batch 中动态步骤创建的完美解决方案。 只是我无法在其中获取参数,这将决定需要执行什么步骤或如何传递步骤数组?

<pre>@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();
}</pre>

谢谢

【问题讨论】:

  • 我猜你从这里拿了这个 sn-p:stackoverflow.com/a/54862683/5019386I am not able to get parameters into this:你指的是哪些参数?那些作业参数或参数是否使用-D 或其他方式传递给JVM?
  • 嗨,Hassine,我是你的忠实粉丝。你是对的,我已经完成了代码 sn-p,实际上,我正在尝试从 Db 获取步骤序列(s1、s2、s3 或 S4、S5),并且根据该作业应该配置步骤,因为我需要在上面的代码中获取(步骤数组),如您所见“//创建您的步骤数组或将其作为参数传递”我正在寻找如何将此步骤数组作为参数传递并进入上述函数
  • 谢谢!我添加了一个完整示例的答案。希望对您有所帮助。

标签: spring spring-batch


【解决方案1】:

我正在寻找如何将此步骤数组作为参数传递并进入上述函数

以下是如何将步骤数组作为参数传递的示例:

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.SimpleJobBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
public class MyJobConfiguration {

    private final JobBuilderFactory jobBuilderFactory;
    private final StepBuilderFactory stepBuilderFactory;

    public MyJobConfiguration(JobBuilderFactory jobBuilderFactory, StepBuilderFactory stepBuilderFactory) {
        this.jobBuilderFactory = jobBuilderFactory;
        this.stepBuilderFactory = stepBuilderFactory;
    }

    public Step initialStep() {
        return stepBuilderFactory.get("initialStep")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("initial step");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
    
    @Bean
    public Step[] dynamicSteps() {
        // load steps sequence from db and create steps here
        Step step1 = stepBuilderFactory.get("step1")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("hello");
                    return RepeatStatus.FINISHED;
                })
                .build();
        Step step2 = stepBuilderFactory.get("step2")
                .tasklet((contribution, chunkContext) -> {
                    System.out.println("world");
                    return RepeatStatus.FINISHED;
                })
                .build();
        return new Step[]{step1, step2};
    }

    @Bean
    public Job job(Step[] dynamicSteps) {
        SimpleJobBuilder jobBuilder = jobBuilderFactory.get("job")
                .start(initialStep());
        for (Step step : dynamicSteps) {
            jobBuilder.next(step);
        }
        return jobBuilder.build();
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyJobConfiguration.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}

这里与 Spring Batch 无关,这是 Spring 依赖注入:将 Step 类型的 bean 数组作为参数传递给另一个 bean 定义方法(Job 类型)。

【讨论】:

  • 非常感谢,它按我的需要工作。我看到了你关于“infoq.com/presentations/batch-lifecycle”Batch Processing 2019 Good One 的演讲。感谢您的出色工作
  • 不客气,我总是很乐意提供帮助!谢谢,很高兴您喜欢这个演示文稿。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多