Ámbito de paso en Spring Batch

Siddharth Bishnoi 12 octubre 2023
  1. Trabajo y paso en lote de primavera
  2. Ámbito de paso en Spring Batch
Ámbito de paso en Spring Batch

Este tutorial enseña cómo trabajar con Step Scope en Spring Batch. Spring Batch tiene tres componentes principales de alto nivel: Aplicación, Batch Core e Infraestructura de Batch.

Trabajo y paso en lote de primavera

Un trabajo es una entidad que encapsula todo el procesamiento por lotes; es decir, está en la parte superior de una jerarquía de trabajo. Cada trabajo contiene uno o más pasos.

Es un contenedor para instancias de pasos donde cada paso tiene un ItemReader, ItemProcessor y ItemWriter. Algunos de los conceptos que incluye un trabajo son JobInstance, JobParameters y JobExecution.

Un paso es un objeto de dominio independiente de un trabajo por lotes que contiene toda la información necesaria para definir y controlar el proceso por lotes. Al igual que un trabajo, un paso tiene una ejecución de paso que se correlaciona con una ejecución de trabajo como en un trabajo.

Spring define dos ámbitos, a saber, StepScope y JobScope.

Ámbito de paso en Spring Batch

Los beans que usan enlace tardío siempre deben declararse con el paso como alcance. Esto se puede hacer configurando scope="step", pero el alcance de paso no se puede usar con el bean de paso.

Si es necesario, los componentes de un paso deben tener un ámbito de paso en su lugar. En Spring Batch, un trabajo está conectado con un archivo de configuración XML o una configuración basada en Java, y la configuración se llama Configuración de trabajo.

El ejemplo que se muestra a continuación muestra el enlace al alcance del paso en XML y JAVA.

Configuración XML:

<bean id="flatFileItemReader" scope="step"
  class="org.springframework.batch.item.file.FlatFileItemReader">
  <property name="resource" value="#{jobParameters[input.file.name]}" />
</bean>

Configuración basada en Java:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("
#{jobParameters[input.file.name] } ") String name) {
  return new FlatFileItemReaderBuilder<Foo>()
  .name("flatFileItemReader")
  .resource(new FileSystemResource(name))
  ...
}

El objeto StepScope es útil de muchas maneras. Una de las razones es que StepScope ayuda a definir la vida útil de los beans.

De forma predeterminada, el alcance del bean es un singleton. Cuando un bean se anota con @singleton, se creará una vez al principio y se destruirá al final, pero un StepScope es único para un paso específico, no para un singleton.

Al especificar un componente como StepScope, el contenedor de primavera iniciará una nueva instancia para cada paso. La vida útil de un bean con ámbito de paso depende de la vida útil del paso.

En un bean con ámbito de paso, los beans se crearán al principio y se destruirán al final de cada paso. La anotación es @StepScope.

Otra razón para usar StepScope es cuando los pasos se ejecutan en paralelo, ya que aislará el estado del bean. A través de esto, cada hilo en cada paso tiene su instancia y no modifica el estado que maneja el otro hilo.

De lo contrario, múltiples subprocesos cambiarán el estado de los beans, haciéndolos inconsistentes. Además, a través de StepScope, se puede pasar información entre pasos a través de stepExecutionContext y stepExecutionListener mientras se realiza el enlace tardío de parámetros.

Por lo tanto, StepScope ayuda a definir la vida útil de los beans y nos permite pasar datos a través de los pasos. El siguiente ejemplo muestra el uso de stepExecutionContext en la configuración de XML y JAVA.

Configuración XML:

<bean id="flatFileItemReader" scope="step"
  class="org.springframework.batch.item.file.FlatFileItemReader">
  <property name="resource" value="#{stepExecutionContext['input.file.name']}" />
</bean>

Configuración basada en Java:

@StepScope
@Bean
public FlatFileItemReader flatFileItemReader(
    @Value("#{stepExecutionContext['input.file.name']}") String name) {
  return new FlatFileItemReaderBuilder<Foo>()
      .name("flatFileItemReader")
      .resource(new FileSystemResource(name))...
}

Discutimos cómo funciona el objeto StepScope en Spring Batch, junto con ejemplos. Para saber más sobre Spring Batch, puede consultar la documentación oficial de Spring Batch.