2017-03-07 1 views
0

Ich habe einen komplexen Jobfluss, in dem ich 3 separate Jobs in einen Jobschritt integriert habe, und dann rufe ich diesen Jobschritt von einem Job auf. Es gibt vier dieser JobSteps, die parallel vom aufrufenden Job ausgeführt werden.So übergeben Sie einen einfachen String an einen Spring Batch-Job

Ich muss ihnen einen String als Parameter übergeben.

Etwas vereinfacht Code:

Meine Haupt sieht wie folgt aus:

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

Einer der JobSteps sieht aus wie

@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; 
} 

Die Top-Job, der Rest wie

sieht läuft
@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(); 

    } 

Ich brauche jeden Jobschritt, um eine andere Zeichenfolge zu erhalten.

+0

Werfen Sie einen Blick auf Partitionierer. Sie können damit Daten an Step übergeben –

Antwort

0

Ich konnte erreichen, wie Nghia Do in seinem Kommentar mit Partitioner vorgeschlagen. Mit Partitionierer konnte ich einen String in den Kontext schieben und dann in einem @Before Step diesen abrufen.

In meinem ItemReader ich habe:

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

The 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 ist nur ein Platzhalter-Funktion jetzt, dass eine Liste von Strings zum Testen zurückgibt. Irgendwann wird es durch etwas Nützlicheres ersetzt.

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; 
    } 

dann die verschiedenen Etappen bekommen ich einen Master-Schritt machen musste, dass meine bestehenden Schritte genannt:

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

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

    } 

Und stepBuilders ist:

@Autowired 
    private StepBuilderFactory stepBuilders; 

hatte sich wie 20 verschiedene Beispiele kombinieren auf das Netz, um all die Dinge zu bekommen, so dass ich sie alle in diese Antwort für die nächste Person setze, die es braucht.

Verwandte Themen