Wir haben Batch-Job mit Einzelschritt konfiguriert. Die allgemeine Struktur ist wie,Verwenden von Ende in Einzelschritt-Batch-Job in Spring Batch
<batch:job id="mainJob">
<batch:step id="step1">
<batch:tasklet>
<batch:chunk reader="fileReader" writer="jmsItemWriter" >
<batch:retryable-exception-classes>
<batch:include class="org.springframework.dao.CannotAcquireLockException"/>
</batch:retryable-exception-classes>
</batch:chunk>
</batch:tasklet>
<batch:end on="UNKNOWN"/>
<batch:next on="*" to="step1"/>
<batch:listeners>
<batch:listener ref="listener1"/>
<batch:listener ref="listener2"/>
</batch:listeners>
</batch:step>
<batch:listeners>
<batch:listener ref="jobListener"/>
</batch:listeners>
</batch:job>
Filereader FlatFileItemReader ist, die eine Datei Zeile für Zeile liest und übergibt jede Zeile zu ‚listener2‘. Wenn es in listen2 einen Fehler in der Zeile gibt, sollte der Status auf 'unbekannt' gesetzt werden (nicht fehlgeschlagen, da der Job nicht erneut gestartet werden sollte) und dann den Job stoppen.
Um dies zu erreichen, haben wir.
<batch:end on="UNKNOWN"/>
<batch:next on="*" to="step1"/>
Aber der Batch-Job endet nicht auf Unbekannt und geht wegen "nächsten" in die Schleife. Es gibt eine Ausnahme, wenn "next" nicht erwähnt wird.
Wie können wir das auflösen?
Edit:
Einige weitere Erklärung für Deans Antwort.
Listener2 erhält FieldSet d. H. Dateieinträge Zeile für Zeile. Wenn während der Verarbeitung dieser Einträge einige Bedingungen (die auch Datenbankabfragen betreffen) erfüllt sind, sollte der Job keine weitere Datei lesen und anhalten. Da die Verarbeitung in der Override-Methode 'mapFieldSet' erfolgt, die keine Ausnahme auslöst, kann keine neue Ausnahme verwendet werden, und die Rückgabe von null liest nur die nächste Zeile. Im Allgemeinen haben die Dateien Tausende von Zeilen, aber innerhalb der ersten 2 Zeilen wird bestimmt, ob weiteres Lesen notwendig ist oder nicht.
ich mehr auf die Antwort hinzugefügt habe unten auf der Grundlage Ihres Updates –