我正在尝试使用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触发作业时执行它,因为它具有所需的参数。
如何在启动应用程序时停止执行?
我需要根据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
来访问步骤执行。
希望这可以帮助。