0

我正在尝试使用 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 触发时执行它,因为它具有所需的参数。

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

4

1 回答 1

0

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

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

但是,如果您想根据 step1 的结果执行(不是创建,而是执行)这些步骤,那么您可以使用JobExecutionDecider. 有关更多详细信息和代码示例,请参阅程序化流程决策。可以在这里找到一个类似的问题:如何在 Spring 批处理中使用决策者?

但为了处理第 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,您可以使用 aStepListener#beforeStep来访问步骤执行。

希望这可以帮助。

于 2019-03-11T08:58:47.963 回答