2017-03-21 4 views
0

Ich habe eine Spring Batch-Anwendung mit Spring-Boot (keine Xml-Konfiguration). Ich versuche, die Nützlichkeit von ExitStatus in meiner Anwendung zu verstehen. Am Ende eines dieser Schritte muss ich eine SQL-Update-Anweisung ausführen. Dies erreiche ich durch eine StepExecutionListener mit wie unten:Spring Batch - Verwenden von ExitStatus für Flow Control

@Component 
public class MyListener extends StepListenerSupport{ 

    @Autowired 
    JdbcTemplate jdbcTemplate; 

    @Transactional 
    @Override 
    public ExitStatus afterStep(StepExecution stepExecution) { 
     jdbcTemplate.execute("some SQL update); 
     return null; 
    } 
} 

Wie Sie sehen können, kehre ich null als ExitStatus und dies scheint gut zu funktionieren. Ich bin mir jedoch nicht sicher, ob dies richtig ist oder ob ich einen bestimmten Wert für ExitStatus zurückgeben muss.

Antwort

2

Zurückgeben null hier sagt effektiv "überschreiben Sie nicht die ExitStatus, die Sie schon verwenden wollten".

Die Nützlichkeit kommt in, weil, wenn Ihre SQL-Anweisung fehlschlägt (und vermutlich eine Ausnahme auslöst), der Schritt wird nicht fehlschlagen. Stattdessen geht es weiter zum nächsten Schritt in Ihrem Job.

Sie müssen die Ausnahme abfangen und ExitStatus.FAILED zurückgeben, um den Schritt und den Job fehlzuschlagen.

Oder nehmen wir an, Sie möchten ein Szenario haben, in dem Sie eine Flusskontrolle basierend auf der Aktivität im Schritt ausführen möchten ... vielleicht war es ein Staging-Schritt und Sie möchten enden, wenn keine Datensätze zu verarbeiten waren Führen Sie einen zusätzlichen Schritt durch, wenn Datensätze auf der Bühne sind. Dann könnte ich Sie so etwas wie dieses:

@Override 
public ExitStatus afterStep(StepExecution stepExecution) { 
    if (stepExecution.getReadCount() > 0) { 
     return ExitStatus.COMPLETED; 
    } 
    return ExitStatus.NOOP; 
} 

dann in Ihre Job-Konfiguration Sie können tun:

jobBuilderFactory.get("myJob") 
      .start(step1()).on("NOOP").end() 
      .from(step1()).on("COMPLETED").to(step2()).end() 
      .from(step1()).on("*").fail() 
      .build(); 
+0

Große Erklärung! Vielen Dank –

Verwandte Themen