Friday, March 27, 2009

Tutorial Spring Batch - File Converter, Parte 1 (Introducción)

Dicen que la mejor forma de aprender algo es enseñándolo. Por esta razón he decidido escribir un pequeño tutorial del uso de Spring Batch 2.0.0.RC2 haciendo un pequeño proyecto para un conversor de archivos de un formato a otro.

Están muy de moda el desarrollo de sistemas basados en servicios, SOA, SaaS, ESB, BPM, etc. Sin embargo, aun existe una gran necesidad en las empresas por aplicaciones de procesamiento masivo de información en ambientes de misión critica. Generalmente este tipo de aplicaciones de procesamiento se desarrollan usando COBOL o C/C++, pero ahora con Spring Batch podemos empezar a pensar en usar Java para este tipo de aplicaciones.

Hay toda una serie de conceptos involucrados en lo que es Spring Batch, de los cuales algunos de los mas importantes para entender esto son:
  • Job: Un Job en Spring Batch es una entidad para encapsular todo un proceso batch. Un Job esta compuesto de una serie de pasos (Steps) que tienen una relación lógica y en conjunto la ejecucion de estos pasos realizan el procesamiento deseado.
  • JobInstance: Así como una Clase es a un Objeto, un Job es a un JobInstance. Un JobInstance es la ejecución de un Job. Por ejemplo, si tenemos definido un Job que debe correr una vez al final del día, la ejecución del Job el día 25 de Marzo del 2009 sera un JobInstance, al igual que la ejecución del Job el día 26 de Marzo del 2009. Sin embargo, si la ejecución del Job el día 26 de Marzo fallo por alguna razón y se intenta re-ejecutar este mismo Job del 26 de Marzo al siguiente día (que seria 27) sigue siendo el mismo JobInstance. Cada JobInstance puede tener múltiples intentos de ejecución (JobExecution), el JobInstance se considera terminado cuando alguno de sus intentos de ejecución tuvo éxito.
  • JoParameters: Son los parámetros que un Job recibe para poder realizar su trabajo. Un JobInstance se distingue de otro por los parámetros que recibe. El JobInstance que se ejecuta el 25 de Marzo se distingue del 26 de Marzo porque el primero recibió como parámetro que su día de ejecución es 25/03/2009 y el otro recibió como parámetro 26/03/2009. Los parámetros pueden ser usados para identificar Jobs o para poder hacer el filtro del conjunto de datos que procesará el Job.
  • JobExecution: Es el intento de ejecución de un JobInstance, terminado con exito o no. Como se menciono antes el JobInstace solo se considera terminado cuando alguno de sus JobExecution ha terminado con éxito. Un JobExecution es el mecanismo primario de almacenamiento de lo que ha pasado durante la ejecución. Un JobExecution tiene las siguientes propiedades:
  1. status: Indica el estatus de la ejecucion. Es un objeto BatchStatus.
  2. startTime: Una fecha java.util.Date que representa el momento en que se inicio la ejecución.
  3. endTime: Una fecha java.util.Date que representa el momento en que termino la ejecución.
  4. createTime: Una fecha java.util.Date que representa el momento en que el JobExecution fue por primera vez persistido.
  5. lastUpdate: Una fecha java.util.Date que representa el momento en que el JobExecution fue por ultima vez persistido.
  6. executionContext: Guarda los valores que mete el usuario para que sean persistidos entre las ejecuciones.
  7. failureExceptions: Una lista de excepciones que ocurrieron durante la ejecucion de un Job. De esta forma se mantiene registro de las diversas excepciones que ocurrieron al ejecutar un Job.
  • Step: Un Job esta compuesto de uno o mas Step. Un Step es un objeto de dominio que encapsula de manera independiente una de toda la secuencia de fases de un Job. Un Step contiene toda la información necesaria que define y controla el actual procesamiento de un proceso batch. Un Step podría tomar la información de un archivo y dispersarla en la base de datos o podría tener lógica mas compleja relacionada al negocio en cuanto a validación de datos, etc.
  • StepExecution: De la misma forma que un JobInstance tiene JobExecution un Step tiene StepExecution. Un StepExecution representa un intento de ejecutar un Step. Una nueva instancia de StepExecution es creada cada que se intenta ejecutar un Step, sin embargo, a diferencia de un JobExecution si un Step falla porque un Step anterior fallo no se persistira su ejecucion. Un StepExecution tiene las siguientes propiedades:
  1. status: Indica el estatus de la ejecucion. Es un objeto BatchStatus.
  2. startTime: Una fecha java.util.Date que representa el momento en que se inicio la ejecución.
  3. endTime: Una fecha java.util.Date que representa el momento en que termino la ejecución.
  4. exitStatus: Un valor ExitStatus indicando el resultado de la ejecucion.
  5. executionContext: Guarda los valores que mete el usuario para que sean persistidos entre las ejecuciones.
  6. readCount: Un contador indicando el numero de elementos que fueron exitosamente leidos.
  7. writeCount: Un contador indicando el numero de elementos que fueron exitosamente escritos.
  8. commitCount: Un contador indicando el numero de transacciones que fueron exitosas.
  9. rollbackCount: Un contador indicando el numero de veces que las transacciones controladas por el Step fueron desechas.
  10. readSkipCount: Numero de veces que la lectura fallo resultando en un elemento ignorado.
  11. processSkipCount: Numero de veces que el proceso fallo resultando en un elemento ignorado.
  12. filterCount: Numero de elementos que fueron filtrados por el ItemProcessor.
  13. writeSkipCount: Numero de veces que la escritura fallo, resultando en un elemento ignorado.
  • ExecutionContext: Un ExecutionContext es una coleccion de elementos llave/valor que son persistidos y controlados por el propio framework que permiten al desarrollador almacenar valores que son persistidos y que estan dentro del alcance de un StepExecution o un JobExecution. El mejor uso de un ExecutionContext es almacenar valores que permiten el reinicio de procesos desde un punto en particular.
  • JobRepository: El JobRepository es el mecanismo de persistencia que usan los ExecutionContext para los StepExecution y JobExecution. Contiene operaciones CRUD (Create, Read, Update, Delete; por sus siglas en ingles) que son utilizadas por las implementaciones de JobLauncher, Job y Step.
  • JobLauncher: Un JobLauncher representa el mecanismo para ejecutar un Job con ciertos JobParameters.
  • ItemReader: Un ItemReader es una abstracción que representa el obtener datos de entrada para un Step, un elemento (item) a la vez. Cuando el ItemReader a acabado de obtener los elementos indica que ya no hay mas elementos que tomar regresando null.
  • ItemWriter: Un ItemWriter es una abstracción que representa la salida de un Step, un elemento a la vez.
  • ItemProcessor: Es una abstracción que representa el procesamiento de un elemento. Mientras el ItemReader lee un elemento y el ItemWriter lo escribe, el ItemProcessor aplica transformaciones u otras reglas. De esta forma, si el ItemProcessor determina que un elemento no es valido regresa null para indicar que el elemento no debe ser escrito.
Relación entre Job, Step y sus elementos.


Creo que por ahora esto sera suficiente como introduccion a los conceptos de Spring Batch, en futuras entradas de este blog ire hablando mas del tutorial del File Converter.

Este tutorial y los conceptos que aqui se explican se basaron en la guia de usuario de Spring Batch que la encuentras en esta pagina:

http://static.springframework.org/spring-batch/

Les recomiendo que bajen el archivo zip de la liberacion de Spring Batch para que vean los ejemplos:

http://static.springframework.org/spring-batch/downloads.html

No comments: