2016-05-30 109 views
2

我想在java配置文件中的並行步驟執行中製作一個示例應用程序,但會困惑地指出需要配置多少文件(作業存儲庫,作業啓動器和執行等)並初始化,如果配置,那麼如何? 簡而言之,我需要一個示例應用程序來闡明並行執行作業中步驟的基礎知識。Spring批處理:在java配置文件中執行並行步驟

回答

3

下面是通過java配置使用分割的示例。在本例中,流程1和2將並行執行:

@Configuration 
public class BatchConfiguration { 

    @Autowired 
    private JobBuilderFactory jobBuilderFactory; 

    @Autowired 
    private StepBuilderFactory stepBuilderFactory; 

    @Bean 
    public Tasklet tasklet() { 
     return new CountingTasklet(); 
    } 

    @Bean 
    public Flow flow1() { 
     return new FlowBuilder<Flow>("flow1") 
       .start(stepBuilderFactory.get("step1") 
         .tasklet(tasklet()).build()) 
       .build(); 
    } 

    @Bean 
    public Flow flow2() { 
     return new FlowBuilder<Flow>("flow2") 
       .start(stepBuilderFactory.get("step2") 
         .tasklet(tasklet()).build()) 
       .next(stepBuilderFactory.get("step3") 
         .tasklet(tasklet()).build()) 
       .build(); 
    } 

    @Bean 
    public Job job() { 
     return jobBuilderFactory.get("job") 
       .start(flow1()) 
       .split(new SimpleAsyncTaskExecutor()).add(flow2()) 
       .end() 
       .build(); 
    } 

    public static class CountingTasklet implements Tasklet { 

     @Override 
     public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception { 
      System.out.println(String.format("%s has been executed on thread %s", chunkContext.getStepContext().getStepName(), Thread.currentThread().getName())); 
      return RepeatStatus.FINISHED; 
     } 
    } 
} 
+0

非常感謝@邁克爾。它的工作 – maddy

+0

@maddy你介意接受這個答案嗎? –

+0

是的。因爲我只想知道多個步驟如何並行運行。所以它給了我一個主意。 – maddy

-1

這裏是對不同數據集執行的基本並行步驟,基本上你必須提供一個分區器,它將爲每個步驟創建單獨的上下文,並根據上下文來處理它的數據集。

<batch:job id="myJob" job-repository="jobRepository"> 
       <batch:step id="master"> 
        <batch:partition step="step1" partitioner="stepPartitioner "> 
         <batch:handler grid-size="4" task-executor="taskExecutor"/> 
        </batch:partition> 
       </batch:step> 

      </batch:job> 

     <batch:step id="step1"> 
       <batch:tasklet> 
        <batch:chunk reader="myReader" processor="myProcessor" writer="myWriter" 
           commit-interval="10"/> 
       </batch:tasklet> 
      </batch:step> 


    public class stepPartitioner implements Partitioner { 

     @Autowired 
     DaoInterface daoInterface; 

     @Override 
     public Map<String, ExecutionContext> partition(int i) { 
      Map<String, ExecutionContext> result = new HashMap<>(); 

      List<String> keys= daoInterface.getUniqueKeyForStep(); 
      for(String key: keys){ 


        ExecutionContext executionContext = new ExecutionContext(); 
        executionContext.putString("key", key); 

        result.put(key,executionContext); 


      } 

      return result; 
     } 
    } 
+1

這不是一個javaconfig例如 –

+0

耶@sandeep那不是javaconfig例子。我需要的所有的javaconfig。 – maddy

2

假設您有步驟A,B1,B2,B3,C。您想要並行運行B1,B2 & B3。首先,您需要爲他們創建子流,然後添加到一個流與SimpleAsyncTaskExecutor():

@Bean 
public Job job() 
{ 
    final Flow flowB1 = new FlowBuilder<Flow>("subflowb1").from(stepb1()).end(); 
    final Flow flowB2 = new FlowBuilder<Flow>("subflowb2").from(stepb2()).end(); 
    final Flow flowB3 = new FlowBuilder<Flow>("subflowb3").from(stepb3()).end(); 

    final Flow splitFlow = new FlowBuilder<Flow>("splitFlow") 
     .start(flowB1) 
     .split(new SimpleAsyncTaskExecutor()) 
     .add(flowB2, flowB3).build(); 

    return jobBuilderFactory 
     .flow(stepA()) 
     .next(splitFlow) 
     .next(stepC()) 
     .end() 
     .build(); 
}