Step Scope in Spring Batch
In diesem Tutorial erfahren Sie, wie Sie mit Step Scope in Spring Batch arbeiten. Spring Batch hat drei Hauptkomponenten auf hoher Ebene: Anwendung, Batch Core und Batch Infrastructure.
Job und Schritt im Frühlingsbatch
Ein Job ist eine Entität, die die gesamte Stapelverarbeitung kapselt; d.h. es steht an der Spitze einer Jobhierarchie. Jeder Job enthält einen oder mehrere Schritte.
Es ist ein Container für Schrittinstanzen, wobei jeder Schritt einen ItemReader
, ItemProcessor
und ItemWriter
hat. Einige der Konzepte, die ein Job enthält, sind JobInstance
, JobParameters
und JobExecution
.
Ein Schritt ist ein unabhängiges Domänenobjekt eines Batch-Jobs, das alle erforderlichen Informationen enthält, um den Batch-Prozess zu definieren und zu steuern. Wie ein Job hat ein Step eine StepExecution
, die mit einer JobExecution
wie bei einem Job korreliert.
Spring definiert zwei Scopes, nämlich StepScope
und JobScope
.
Schrittumfang in Spring Batch
Beans, die Late Binding verwenden, müssen immer mit dem Schritt als Geltungsbereich deklariert werden. Dies kann durch Setzen von scope="step"
erfolgen, aber der Step-Scope kann nicht mit dem Step-Bean verwendet werden.
Falls erforderlich, sollten die Komponenten in einem Schritt stattdessen schrittbezogen sein. In Spring Batch wird ein Job entweder mit einer XML-Konfigurationsdatei oder einer Java-basierten Konfiguration verknüpft, und die Konfiguration heißt JobConfiguration
.
Das unten gezeigte Beispiel zeigt die Bindung an den Schrittbereich in XML und JAVA.
XML-Konfiguration:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>
Java-basierte Konfiguration:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("
#{jobParameters[input.file.name] } ") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))
...
}
Das Objekt StepScope
ist in vielerlei Hinsicht nützlich. Einer der Gründe ist, dass StepScope
dabei hilft, die Lebensdauer der Bohnen zu bestimmen.
Standardmäßig ist der Bean-Bereich ein Singleton. Wenn eine Bean mit @singleton
annotiert ist, wird sie am Anfang einmal erstellt und am Ende zerstört, aber ein StepScope
ist eindeutig für einen bestimmten Schritt, nicht für einen Singleton.
Durch die Angabe einer Komponente als StepScope
startet der Spring Container für jeden Schritt eine neue Instanz. Die Lebensdauer einer Step-Scoped-Bean hängt von der Lebensdauer des Steps ab.
In einer Step-Scope-Bean werden die Beans zu Beginn jedes Steps erstellt und am Ende jedes Steps zerstört. Die Anmerkung ist @StepScope
.
Ein weiterer Grund, StepScope
zu verwenden, ist, wenn Schritte parallel ausgeführt werden, da dies den Zustand der Bean isoliert. Dadurch hat jeder Thread in jedem Schritt seine Instanz und ändert nicht den Zustand, der von dem anderen Thread verwaltet wird.
Wenn nicht, ändern mehrere Threads den Status der Beans, wodurch sie inkonsistent werden. Außerdem können über StepScope
Informationen zwischen Schritten durch stepExecutionContext
und stepExecutionListener
übergeben werden, während die späte Bindung von Parametern durchgeführt wird.
So hilft StepScope
, die Lebensdauer der Beans zu definieren und ermöglicht es uns, Daten über Stufen hinweg zu übergeben. Das folgende Beispiel zeigt die Verwendung von stepExecutionContext
in der XML- und JAVA-Konfiguration.
XML-Konfiguration:
<bean id="flatFileItemReader" scope="step"
class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>
Java-basierte Konfiguration:
@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(
@Value("#{stepExecutionContext['input.file.name']}") String name) {
return new FlatFileItemReaderBuilder<Foo>()
.name("flatFileItemReader")
.resource(new FileSystemResource(name))...
}
Wir haben besprochen, wie das Objekt StepScope
in Spring Batch funktioniert, zusammen mit Beispielen. Um mehr über Spring Batch zu erfahren, können Sie auf die offizielle Dokumentation von Spring Batch verweisen.