我正在尝试使用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触发时执行它,因为它具有必需的参数。
请帮助我在启动应用程序时如何停止执行。
答案 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
来访问步骤执行。
希望这会有所帮助。