我有一份工作,由不同的jobSteps组成。
我想一起触发一批这些JobSteps(JobStep1 | JobStep2 | JobStep3)(与AsyncTaskExecutor在不同线程中运行)
当其他作业步骤完成时,最后一个作业步骤(作业步骤4)。
因此,我为每个JobStep创建了不同的流程,并使用AsyncTaskExecutor将它们放在一个流程中。
我还为最后一个JobStep制作了一个流程。
JobStep1 | JobStep2 | JobStep3完成时
作业步骤4
下面的代码代表了我的实现:
Flow flowJob1= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep1).end();
Flow flowJob2= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep2).end();
Flow flowJob3= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep3).end();
Flow flowJob4= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep4).end();
Flow splitFlow = new FlowBuilder<Flow>("splitflow").split(new SimpleAsyncTaskExecutor()).add(flowJob1,flowJob2,flowJob3).build();
然后对于创建作业,我使用以下功能:
JobFlowBuilder jobFlowBuilder = jobBuilderFactory.get(jobName).repository(jobRepository)
.start((Flow)splitFlow);
jobFlowBuilder.next(flowJob4);
FlowJobBuilder flowJobBuilder= jobFlowBuilder.build();
Job parentJob = flowJobBuilder.build();
return parentJob;
问题是:
主Job不会等待所有JobSteps(在不同线程中)完成,然后再运行下一个JObStep。我应该做些 Spring 批处理配置来解决这个问题吗?
最佳答案
您需要将JobStep
1-3合并为一个FlowStep
。然后,您将使用常规的SimpleJobBuilder
构建您的工作。
Flow flowJob1= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep1).end();
Flow flowJob2= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep2).end();
Flow flowJob3= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep3).end();
// Don't need this
// Flow flowJob4= new FlowBuilder<Flow>(jobStep.getName()).from((JobStep)jobStep4).end();
Flow splitFlow = new FlowBuilder<Flow>("splitflow").split(new SimpleAsyncTaskExecutor()).add(flowJob1,flowJob2,flowJob3).build();
FlowStep flowStep = new FlowStep(splitFlow);
SimpleJobBuilder jobBuilder = new JobBuilder(yourJobName).start(flowStep);
jobBuilder.next(jobStep4);
关于java - Spring Batch FlowJobBuilder : Parallel and sequential execution of “jobStep” type Steps,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37192240/