1
我有一个由不同jobSteps组成的作业。 我想触发了一批这些JobSteps的(JobStep1 | JobStep2 | JobStep3)一起(在不同的线程运行AsyncTaskExecutor) 和最后JobStep(JobStep 4)当其他JobSteps完成。 因此,我为每个JobStep创建了不同的Flow,并将它们与AsyncTaskExecutor放在一个Flow中。 我也为最后一个JobStep做了一个Flow。Spring批处理FlowJobBuilder:并行和顺序执行“jobStep”类型步骤
JobStep1 | JobStep2 | JobStep3已完成 JobStep 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;
的问题是: 主作业不会等待所有JobSteps(在不同的线程中)完成,然后运行下一个JObStep。是否有任何弹簧批量配置可以解决此问题?
非常感谢您的回复,但它似乎即使这样,父作业(线程)也不会等待splitflow中的子作业(线程)完成其作业。它异步行为。并在其他人完成之前触发jobStep4 –
这当然令人讨厌。但是,你可以做什么来真正强迫它的手......为所有4个作业添加一个'JobExecutionLister',并声明他们都共享引用的单例新'CountDownLatch(3)'。在作业1-3中,在'afterJob()'方法中使用'countDown()'。在Job 4中,使用'beforeJob()'方法中的'await()'。这将阻止工作4完成任何工作,直到其他工作完成。 –
是的,那是我现在想要做的。我会把步骤executionListener放到每个JobStep.thanks很多的支持 –