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很多的支持 –