Spring Batch

De Dos Ideas.

Spring Batch es el framework para procesamiento de lotes de Spring Framework. Este framework apunta a crear una plataforma que brinde servicios comunes para los programas batch.

Procesamiento con Spring Batch
Visitá el taller donde encontrarás más información, ejemplos y prácticas sobre este tema.

Contenido

Arquitectura básica

El elemento principal de Spring Batch es el Job (Trabajo). Un Job representa un procesamiento batch a ejecutar. Un Job está compuesta de varios Step (Pasos), que se ejecutan en forma secuencial.

El mismo Job puede configurarse con distintos parámetros que lo diferencian (por ejemplo, la fecha de ejecución). Esto se conoce como JobInstance. Así, un JobInstance es la particularización de un Job con un conjunto de datos determinados.

La ejecución de un JobInstance es un JobExecution. Así, un JobInstance puede tener asociados muchos JobExecution, uno por cada intento de ejecución (por ejemplo, 2 intentos fallidos y uno exitoso).

Además, Spring Batch lleva un registro de todas las ejecuciones y parámetros con las que se lanzaron los Job. El encargado de guardar estos registros es el JobRepository, que cuenta con una implementación para almacenar la información en una base de datos. Spring Batch utiliza un modelo de tablas propio para guardar la información de las corridas, tiempos, parámetros de invocación, pasos que se ejecutaron y otros datos.

Por último, el encargado de ejecutar los Job se llama JobLauncher.

JobRepository

El JobRepository es el encargado de almacenar información sobre las ejecuciones de los Job.

Existen dos implementaciones básicas de JobRepository: una que funciona en memoria (útil para desarrollo) y una que almacena la información en una base de datos.

MapJobRepositoryFactoryBean

Esta implementación almacena la información en memoria, en un Map. Es la forma más simple de configurar un JobRepository, ya que no necesita de una base de datos.

Su configuración:

<beans>
<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager"/>
 
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
</bean>
</beans>

JobRepositoryFactoryBean

Esta es la implementación más usada para un JobRepository, y utiliza un modelo de datos propio de Spring Batch para almacenar la información de las ejecuciones en una base de datos.

Los scripts del modelo de datos para distintas bases de datos se puede encontrar en la raíz del archivo spring-batch-core-XXXXX.jar.

Su configuración requiere, por lo tanto, de un datasource asociado. En el siguiente ejemplo se utiliza un DataSource de una base de datos Apache Derby:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.apache.derby.jdbc.ClientDriver"/>
<property name="url" value="jdbc:derby://localhost:1527/springbatch"/>
<property name="username" value="springbatch"/>
<property name="password" value="springbatch"/>
</bean>
 
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
 
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"
p:databaseType="derby"
p:dataSource-ref="dataSource"
p:transactionManager-ref="transactionManager"/>

Los Step

Un Job está compuesto de varios Step que se ejecutan, inicialmente, de manera secuencial. El Step más común es el implementado por la clase SimpleStepFactoryBean, o por la clase TaskletStep.

SimpleStepFactoryBean

Esta clase crea Steps que constan de un "lector de datos" (ItemReader) y un "procesador de datos" (ItemWriter).

El ItemReader será un bean encargado de leer datos de algún origen. Cada dato leído será pasado al ItemWriter para su procesamiento.

Existen varias implementaciones de ItemReader y ItemWriter que ya trae Spring Batch. Estas implementaciones resuelven accesos comunes, como ser leer de una base de datos, lectura/escritura en archivos de texto, etc.

Además, es muy simple implementar un ItemReader o ItemWriter propio.

TaskletStep

Un Tasklet es una acción muy básica en Spring Batch, y se usa para realizar ejecuciones simples. Un Step que ejecuta un tasklet se implementa con la clase TaskletStep.

Ver también