2017-03-07 42 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的網絡,所以我將它們全部放在下一個需要它的人的答案中。

相關問題