Á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.