sábado, 24 de mayo de 2008

Primeros pasos con Spring Batch

Hace un tiempo atrás José Miguel Selman publico en su blog el lanzamiento oficial de la versión 1.0 de Spring Batch y desde aquella vez que he querido poder programar un simple ejemplo para meter mis manos en esta nueva funcionalidad que nos ofrece la gente de “SpringSource”, pero por motivos de tiempo (trabajo, clases, JUG, proyectos de investigación,…..etc) nunca he podido darme un tiempo, hasta hoy que me decidí a como de lugar programar mis primeras líneas en” Spring Batch” (mas bien no jugar PS3 :-( …....pero bueno….Lost Planet puede esperar).

En “Spring Batch” un Job es un proceso que se encuentra compuesto por uno o más Step. Para construir un Job utilizaremos una JobInstance, la cual nos permitirá definir un Job, asociándole un conjunto de propiedades llamadas JobParameters. Cada ejecución de una JobInstance será una JobExcecution.

Por ejemplo, supongamos que necesitamos cada cierto periodo de tiempo leer un información de un repositorio de datos (una base de datos, un chache, etc…), generar un archivo XML que represente a esa información e insertar este una cola de mensajería JMS. Este conjunto de tareas sería un Job el cual estaría compuesto de tres Step. Si además, parametrizamos este Job para que se ejecute cada cierto periodo de tiempo (una hora por ejemplo), cada periodo de tiempo seria una JobInstance y cada vez que se ejecute esta instancia (depende de la hora), sería una JobExecution. Este modelo propuesto por “Spring Batch” permite a los desarrolladores una gran flexibilidad respecto a cómo nuestros Job serán lanzados y ejecutados.

El responsable de ejecutar cada uno de los Job definidos, además del grupo de parámetros asociados a este será el JobLauncher. Por último, en muchos casos, necesitaremos algún lugar donde poder almacenar información en tiempo de ejecución relacionada con el proceso batch, para lo cual se utiliza un JobRepository.

Para cada Job es recomendable utilizar un archivo XML de contexto diferente (ya veo un modulo de procesos batch definido con Impala….full!!!). Sin embargo, necesitaremos un conjunto de beans que serán utilizados por cada uno de estos Job. Estos objetos los agruparemos en el applicationContext.xml, los cuales serán importados desde cada una de las definiciones de los Job.

Es Los objetos comunes son:

  • JobLauncher: El cual será el responsable de iniciar un Job cargando cada uno de sus parámetros asociados. La implementación más básica se encuentra proveida por la clase SimpleJobLauncher, la cual se soporta en un TaskExecutor para iniciar cada uno de los Job. Si no se especifica el tipo de TaskExecutor se configurara un SyncTaskExecutor por defecto.
  • JobRepository: Para el manejo del repositorio utilizaremos un SimpleJobRepository, la cual requerirá un conjunto de DAOs para almacenar la información.
  • JobInstanceDAO, JobExecutionDAO y StepExecutionDAO: Estos DAO serán usados por el SimpleJobRepository para almacenar información relacionada con la ejecución de los Job. Para esto, “Spring Batch” provee dos tipos de implementación: basados en Map (se almacenan los datos en memoria) y en JDBC.

En el archivo applicactionContext.xml quedaria asi:



Para programar nuestro ejemplo, la clase deberá implementar la interfaz Tasklet. Dentro de esta clase programaremos la lógica que deberá ejecutar un Job, que en nuestro caso será un mensaje por consola.


Fíjense que el método “execute” retorna un ExitStatus para indicar el estado de ejecución del Tasklet.

Ahora solo nos queda definir nuestro primer Job en un archivo de contexto que llamaremos EjemploBasicoJob.xml. Dentro de este, utilizaremos la implementación de un SimpleJob la cual ejecutara todos los Step secuencialmente. Para poder definir un Tasklet dentro de un Job, deberemos utilizar un TaskletStep.



Spring Batch” provee muchas formas de ejecutar un Job. La más simple es utilizando la clase CommandLineJobRunner, al cual se puede ejecutar desde línea de comandos y recibe como parámetros iniciales el nombe del archivo de contexto XML donde está definido el Job y el nombre del bean del Job. En mi caso lo estoy ejecutando desde Eclipse, así que solo necesitao crear una nueva “Java Application” y en el “Main class” definir la clase CommandLineJobRunner.



Por último, se le debe pasar por parámetro el nombre del archivo XML de contexto donde se encuentra definido el Job y el nombre del bean del Job.



El codigo fuente desde este ejemplo lo pueden descargar desde aqui




Más información respecto a ejemplo más complejos lo pueden consultar en http://static.springframework.org/spring-batch/spring-batch-docs/reference/html/execution.html.

Nos vemos en el JUG DAY!!!!