Spring批处理并行处理根据step1结果创建步骤

问题描述 投票:0回答:1

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

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

其余的控制器看起来,

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触发作业时执行它,因为它具有所需的参数。

如何在启动应用程序时停止执行?

multithreading spring-boot parallel-processing spring-batch tasklet
1个回答
0
投票

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

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

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

但是为了处理step1,我需要请求参数。

我看到你已设法获取请求参数并将其设置为作业参数。您可以做的是在步骤执行的步骤中访问这些作业参数。如果您的步骤是一个简单的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来访问步骤执行。

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.