Spring Batch并行处理基于step1结果创建步骤

时间:2019-03-08 04:41:03

标签: multithreading spring-boot parallel-processing spring-batch tasklet

我正在尝试使用spring boot和spring batch实现并行处理。批处理将从用户界面中使用一些必需参数触发

我需要根据请求参数创建步骤,如下所示,

其余控制器看上去,

JobParameters jobParameters = new JobParametersBuilder().addLong("JobID",System.currentTimeMillis())
                    .addString("fileName", filename) 
                    .addString("buisinessDate", model.getGeneralServiceModel().getBusinessDate()) 
                    .addString("source", model.getGeneralServiceModel().getSource()) 
                    .toJobParameters();
            jobLauncher.run(job, jobParameters);

以及批处理配置:

Flow masterFlow = (Flow)new FlowBuilder("masterFlow").start(stepOne()).build();

    List<Step> steps = new ArrayList<Step>();
    for (ConcurrentLinkedQueue date : taskOne.readFile()) {
        steps.add(createStep(date));
    }

    return jobs.get("myJob")
            .start(masterFlow)
             .next(createParallelFlow(steps))
             .end()
             .build();

masterFlow将作业参数读入其变量,然后readFile()给出列表(基于此步骤,必须创建步骤),为此需要jobParameters。

问题是:

在启动我的应用程序本身时,将执行readFile()。但是我需要在作业通过RestController触发时执行它,因为它具有必需的参数。

请帮助我在启动应用程序时如何停止执行。

1 个答案:

答案 0 :(得分:0)

  

我需要根据step1结果创建步骤

创建步骤是您在配置时执行的操作。步骤1的结果只能在运行时知道。因此,为此,您需要在运行时访问应用程序上下文,并根据Step1的结果动态注册步骤Bean。我不确定这是否真的是您的目标。

但是,如果您要基于step1的结果执行(而不是创建,而是执行)这些步骤,则可以使用JobExecutionDecider。有关更多详细信息和代码示例,请参阅Programmatic Flow Decisions。在这里可以找到类似的问题:How to use decider in Spring batch?

  

但是要处理步骤1,我需要请求参数。

我看到您已经设法获取请求参数并将其设置为作业参数。您可以做的是在执行步骤的过程中访问这些作业参数。如果您的步骤是一个简单的Tasklet,请参见以下示例:

class MyTasklet implements Tasklet {
    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
        Map<String, Object> jobParameters = chunkContext.getStepContext().getJobParameters();
        // use job parameters
        return RepeatStatus.FINISHED;
    }
}

如果您的步骤是面向块的Tasklet,则可以使用StepListener#beforeStep来访问步骤执行。

希望这会有所帮助。