2017-03-07 64 views
0

我有一个复杂的作业流程,其中有3个独立的作业构建到JobStep中,然后从作业调用JobStep。这些JobSteps中将有四个将从调用作业并行运行。如何将一个简单的字符串传递给Spring批处理作业

我需要将一个字符串作为参数传递给它们。

一定程度的简化代码:

我主要如下所示:

public static void main(String[] args) { 
     SpringApplication.run(SomeApplication.class, args); 
} 

其中JobSteps的样子

@Bean 
public JobStep jobStep1(<snip>){ 
     <snip for clarity> 
     JobStep jobStep = new JobStep() ; 
     jobStep.setJob(jobs.get(jobName) 
       .incrementer(new RunIdIncrementer()).listener(listener) 
       .start(Flow1) 
       .next(Flow2) 
       .next(Flow3) 
       .end().build()); 
     jobStep.setJobRepository(jobRepository); 
     jobStep.setJobLauncher(jobLauncher); 
     return jobStep; 
} 

运行,其余看起来像

的最高职位
@Bean 
    public Job parentJob(<snip>) { 

     Flow childJobFlow = new FlowBuilder<SimpleFlow>("childJob").start(job1).build(); 
     Flow childJobFlow2 = new FlowBuilder<SimpleFlow>("childJob2").start(job2).build(); 

     FlowBuilder<SimpleFlow> builder = new FlowBuilder<SimpleFlow>("jobFlow"); 
     Flow jobFLow = builder.split(new SimpleAsyncTaskExecutor()).add(childJobFlow,childJobFlow2).build(); 

     return jobs.get("parentJob") 
       .incrementer(new RunIdIncrementer()).listener(listener) 
       .start(jobFLow)    
       .end().build(); 

    } 

我需要每个JobStep来获得不同的字符串。

+0

请看看Partitioner。您可以使用它将数据传递给Step –

回答

0

我能够完成Nghia Do使用分区程序在他的评论中提出的建议。通过分区程序,我可以将字符串推送到上下文,然后在@Before Step中检索它。

在我ItemReader我:

@BeforeStep 
public void beforeStep(StepExecution stepExecution) throws Exception { 
    this.stepExecution = stepExecution.getExecutionContext(); 
    this.keyString = stepExecution.getString("keyString"); 
} 

的Paritioner

@Override 
public Map<String, ExecutionContext> partition(int gridSize) { 
    Map<String, ExecutionContext> partitionMap = new HashMap<String, ExecutionContext>(); 
    List<String> codes = getCodes(); 

    for (String code : codes) 
    { 
     ExecutionContext context = new ExecutionContext(); 
     context.put("keyString", code); 
     partitionMap.put(code, context); 
    } 
    return partitionMap; 
} 

getCodes只是一个占位符的功能,现在是返回测试字符串列表。最终它将取代更有用的东西。

private List<String> getCodes() { 
     ArrayList<String> result = new ArrayList<String>(); 
     result.add("One"); 
     result.add("Two"); 
     result.add("Three");  
     result.add("Four"); 
     result.add("Five"); 
     result.add("Six"); 
     result.add("Seven"); 
     return result; 
    } 

然后让我不得不做出一个主一步,叫我现有的步骤步骤:

@Bean 
    public Step masterStep(@Value("#{proccessFilesStep}") Step readFilesStep) { 

     return stepBuilders.get("masterStep") 
       .partitioner(readFilesStep) 
       .partitioner("proccessFilesStep", partitioner()) 
       .taskExecutor(taskExecutor()) 
       .build(); 

    } 

而且stepBuilders是:

@Autowired 
    private StepBuilderFactory stepBuilders; 

不得不像20个不同的例子上合并获得所有peices的网络,所以我将它们全部放在下一个需要它的人的答案中。

相关问题