2016-05-12 495 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很多的支持 –