2016-05-30 108 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(); 
}