Step Scope in Spring Batch

Siddharth Bishnoi 12 Oktober 2023
  1. Job und Schritt im Frühlingsbatch
  2. Schrittumfang in Spring Batch
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.