Ir al contenido principal

Spring Batch

Tenemos a nuestra disposición muchos frameworks para facilitar el desarrollo de aplicaciones Web, para la construcción de servicios web, para el mapeo objeto-relacional con bases de datos, pero los frameworks que intentan estandarizar tareas propias del procesado por lotes no son muy comunes. Spring Batch es el framework para procesamiento por lotes de Spring Framework.

En el diagrama de abajo vemos un diagrama típico de la arquitectura de procesamiento por lotes. Los elementos grises corresponden a recursos externos como planificadores o bases de datos. Los azules son los servicios que proporciona Spring Batch a los programadores. Por último los elementos coloreados de verde son las piezas que debe construir un programador para llevar a cabo una tarea por lotes específica.





Como vemos la arquitectura de procesamiento por lotes se divide en 4 capas:

  • Capa de ejecución. Está relacionada con la planificación y el lanzamiento de la aplicación.
  • Capa de tareas. Es la responsable de la ejecución de las tareas. En cada tarea se ejecutan secuencialmente un determinado número de pasos, asegurando que todos ellos acaban en un estado correcto y se aplican las políticas apropiadas.
  • Capa de aplicación. Contiene los elementos necesarios para ejecutar la lógica de procesamiento por lotes aplicando unas políticas determinadas.
  • Capa de datos. Son las bases de datos, ficheros o colas fuentes o destinos del procesamiento por lotes.

El elemento principal de Spring Batch es el Job (Trabajo). Está compuesto por varios Steps (Pasos), que se ejecutan de forma secuencial.
Un Job puede configurarse con distintos parámetros que lo diferencian. Un Job con unos determinados parámetros es un JobInstance. Un JobInstance representa la ejecución de un JobExecution.
Spring Batch lleva un registro de todas las ejecuciones y parámetros con las que se lanzaron los Jobs. El encargado de guardar estos registros es el JobRepository, que cuenta con una implementación para almacenar esta información en base de datos o memoria.


La interfaz de un JobLauncher es la siguiente:

package org.springframework.batch.core.launch;
(...)
public interface JobLauncher {
  public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException,
JobRestartException, JobInstanceAlreadyCompleteException,
JobParametersInvalidException;
}



Este método acepta dos parámetros: el Job (normalmente configurado en un fichero de configuración XML ) y una clase JobParameters (que se crea dinámicamente en el proceso de ejecución de tareas).
Nuestras aplicaciones pueden usar esta clase para lanzar un Job, pero también se puede realizar mediante línea de comandos o planificadores como Quartz o Cron.
El JobLauncher encapsula políticas para lanzar los Jobs síncrona o asíncronamente.
El JobRepository se encarga de almacenar información sobre las ejecuciones de los Jobs. Existen dos implementaciones básicas de JobRepository, una que almacena la información en memoria y otra en base de datos.
  • MapJobRepositoryFactoryBean. Esta implementación almacena toda la información de las ejecuciones de los Jobs en memoria.

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

  • JobRepositoryFsctoryBean. Esta implementación utiliza un modelo de datos propio de Spring Batch.para almacenar la información de las ejecuciones. Los scripts de las diferentes bases de datos se encuentra en la raíz del fichero spring-batch-core{VERSION}.jar.


<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"/>


Un Job está compuesto por varios Steps. Los Steps más comunes se implementan mediante las clases:
  • SimpleStepFactoryBean. Crea Steps que constan de un lector de datos (ItemReader) y un procesador de datos (ItemWriter). El ItemReader se encarga de leer datos de algún origen. Cada dato se pasará al ItemWriter para su procesamiento. Existen Reader y Writer por defecto en Spring Batch (base de datos, ficheros, colas...). Además se pueden implementar nuevos con facilidad.
  • TaskletStep. Es una acción básica en Spring Batch. Un Step que ejecuta un tasklet se implementa con la clase TaskletStep.

Visto en DosIdeas

Comentarios

Entradas populares de este blog

Soluciones Alchemy Classic 389 elementos

Hace algún tiempo salió una actualización del Juego Alchemy Classic en la que aparecían más elementos (389 en lugar de 238). Aparte de añadir elementos mejoran algunas traducciones en castellano y mejoran la interfaz, aunque todavía hay algún error en algunos nombres de elementos. Aquí os dejo las soluciones para los que estén atascados y no puedan dormir por las noches: Sustancia primaria Aire=Elemento primario  Fuego=Elemento primario  Agua=Elemento primario  Tierra=Sustancia Primaria Arena=Piedra + Aire Piedra=Tierra + Fuego Arcilla=Arena + Pantano Caliza=Tierra + Amonitas Carbono=Fuego + Madera Cloro=Fuego + Sal + Electricidad CO2(Dióxido de Carbono)=Ceniza + Ácido nítrico Electricidad=Relámpago+ Metales Gas natural= Yacimiento de gas + Pozo Helio=Refinería de gas + Gas Natural Hidrógeno=Electricidad + Agua Hielo=Frío + Agua Imán=Piedra + Metales Metano=Deshechos Vegetales + Pantano Oxígeno=Electricidad + Agua Petróleo=Unidad

JAXB: Leer y escribir ficheros XML

Muchas veces en nuestras aplicaciones debemos manejar documentos XML ( Extensible Markup Language ). Este lenguaje se ha convertido en un estándar para intercambio de datos entre programas y aplicaciones a través de Internet. En un esquema XML (o  XSD ) podemos definir los elementos que pueden aparecer en un documento XML así como las relaciones entre los mismos. JAXB ( Java Architecture for XML Binding ) es un estándar Java para transformar un esquema XML (o  XSD ) en una representación a objetos java. Mediante la API de JAXB podemos mapear un objeto Java a un documento XML ( "marshall" ) y el proceso contrario, es decir, a partir de un esquema XML crear su conjunto de objeto Java asociado ( "unmarshall" ). JAXB Resumiendo lo que nos proporciona JAXB es: Generación de objetos Java a partir de un XSD a través de un compilador Proporciona capacidades de marshall/unmarshall (escribir fichero XML desde java y al contrario) Integración con Maven a través de xj

Matemáticas y cine.

El otro día estaba viendo por la televisión una película llamada 21 blackjack . En una escena de la película el profesor de matemáticas ( Kevin Spacey ) le presenta a uno de sus alumnos la siguiente situación: se encuentra en un concurso en la que debe escoger entre tres puertas (1,2 y 3). En dos de ellas hay una cabra, sin embargo en una de las 3 hay un flamante coche nuevo. El alumno responde que quiere abrir la puerta. El presentador, conocedor de lo que hay detrás de cada puerta decide abrir otra puerta diferente mostrando detrás de ella una cabra. El profesor se dirige al alumno y le pregunta, ¿cambiarías la puerta o te quedarías con la puerta que tienes? Muchos de nosotros cambiaríamos de puerta pensando que es una treta del presentador para engañarnos. ¿Cual elegiríais vosotros? Al comienzo tenemos 1/3 de probabilidades de acertar la puerta donde está el coche. Una vez que el presentador abre la puerta con una cabra, la mayoría de gente piensa que hay la misma probabilidad de