2017-02-09 4 views
0

Ich bin neu zu Spring Batch und ich versuche, einen Linux-Sortierbefehl nach dem Batch-Prozess mit SystemCommandTasklet als zweiten Schritt auszuführen. Es wird jedoch NullPointerException ausgelöst, wenn größere Dateien sortiert werden (was einige Zeit in Anspruch nimmt, etwa 250 MB). Es sieht so aus, als ob SystemCommandTasklet StepExecution in beforeStep() nicht initialisieren und einen Fehler ausgeben kann. Kann jemand meine Konfiguration überprüfen und mich wissen lassen, wenn ich irgendeine Konfiguration vermisse, die das verursacht?Spring Batch SystemCommandTasklet werfende Nullzeigerausnahme

BatchConfig.java

@Bean 
public Job job() throws Exception { 
    return jobs.get("job") 
      .incrementer(new RunIdIncrementer()) 
      .flow(step1()).on("FAILED").fail().on("COMPLETED").to(step2()) 
      .end() 
      .build(); 
} 

@Bean 
public Step step1() { 
    return steps.get("step1") 
      .<FileEntry,FileEntry>chunk(100) 
      .reader(reader()).faultTolerant().skipLimit(MAX_SKIP_LIMIT).skip(FlatFileParseException.class) 
      .processor(new Processor()) 
      .writer(compositeWriter()).stream(outputwriter()).stream(rejectwriter()) 
      .listener(new CustomStepExecutionListener()) 
      .build(); 
} 

@Bean 
public Step step2() throws Exception { 
    return steps.get("step2") 
      .tasklet(sortingTasklet()) 
      .build(); 
} 

@Bean 
@StepScope 
public Tasklet sortingTasklet() throws Exception { 
    SystemCommandTasklet tasklet = new SystemCommandTasklet(); 
    logger.debug("Sorting File : " + getOutputFileName()); 
    tasklet.setCommand(new String("sort " + getOutputFileName() + " -d -s -t \001 -k1,1 -o " + getOutputFileName() + ".sorted ")); 
    tasklet.setTimeout(600000l); 
    return tasklet; 
} 

Hier ist der Link zu SpringBatch Quellcode für SystemCommandTasklet, seine Wurfnullpointer an der Linie 131.
https://github.com/spring-projects/spring-batch/blob/master/spring-batch-core/src/main/java/org/springframework/batch/core/step/tasklet/SystemCommandTasklet.java

Antwort

0

Sie sind nicht die SystemCommandTasklet als StepExecutionListener Registrierung und Da Sie die implementierende Klasse für die Methode @Bean nicht zurückgeben, weiß Spring Batch nicht, dass das Tasklet diese Schnittstelle implementiert. Ich würde zwei Dinge empfehlen, sicher zu sein:

  1. Ändern der Konfigurationsmethode Unterschrift des Tasklet zu sein: @Bean @StepScope public SystemCommandTasklet sortingTasklet() throws Exception {

  2. die Tasklet als Zuhörer auf Ihrem Schritt Register als auch, ähnlich wie Sie‘ Re tut es mit der CustomStepExecutionListener.

+1

Vielen Dank für die Antwort. Es funktioniert jetzt perfekt. Außerdem bin ich ein großer Fan von Spring Batch :) –

+0

@Mihael Minella, welchen Schritt würden Sie das Tasklet als Hörer auf registrieren? – mfunaro

+0

Der Schritt, auf dem es verwendet wird. –