2016-05-12 67 views
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。是否有任何弹簧批量配置可以解决此问题?

回答

0

你要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); 
+0

非常感谢您的回复,但它似乎即使这样,父作业(线程)也不会等待splitflow中的子作业(线程)完成其作业。它异步行为。并在其他人完成之前触发jobStep4 –

+1

这当然令人讨厌。但是,你可以做什么来真正强迫它的手......为所有4个作业添加一个'JobExecutionLister',并声明他们都共享引用的单例新'CountDownLatch(3)'。在作业1-3中,在'afterJob()'方法中使用'countDown()'。在Job 4中,使用'beforeJob()'方法中的'await()'。这将阻止工作4完成任何工作,直到其他工作完成。 –

+0

是的,那是我现在想要做的。我会把步骤executionListener放到每个JobStep.thanks很多的支持 –