Les Present Amos Spring Batch

March 22, 2018 | Author: Abmel Salim Lopessier | Category: Spring Framework, Computer File, Command Line Interface, Databases, Table (Database)


Comments



Description

Les presentamos Spring BatchSábado 06 de Septiembre de 2008 21:31 Escrito por Diego Gomez Intentaremos hacer una introducción a Spring Batch, uno de los componentes de Spring mas desconocidos hoy en día. No será esta una guía completa del framework, aunque pretendemos facilitar el primer contacto con este componente y nombrar algunas de sus características. Aunque no nos resulte el trabajo mas excitante el escribir programas batch, siempre es necesario en los trabajos tener claro como podríamos utilizar un framework para tal fin. Ya hace unas semanas que jugamos un poco con el framework -sabrán que fue mas Leo que yo no...- aunque les cuento que leí casi toda la funcionalidad que ofrecía el componente y llegue a entender el ejemplo que Leo me pasó y todo. En esas semanas pensabamos que teníamos un proyecto 'justo' para este framework, que por razones de tiempo -y a veces de NO esfuerzo- no pudimos implementar en producción. Antes de comenzar Les cuento que soy una de esas personas que de los últimos diez años ha pasado casi seis haciendo programas batch -por suerte no fueron los últimos seis, sino los primeros- y despues de estos últimos cuatro años sin hacer batch, la verdad que se me ponen los pelos de punta cuando me hablan de los mismos. Programas en C, PRO*C monolíticos con miles de líneas de código, con un montón de código que se dejo de usar y da miedo sacar, con nada de documentación y si MILES de líneas de código (5000, 7000)... o sea, difíciles de entender, de mantener, eso que ahora me molesta mas, antes estaba acostumbrado. Cuando empecé a leer la documentación, el primer pensamiento que se me vino a la mente fue 'Ufff, estos de Spring se pasaron de la raya con la ingeniería de la librería, o con la sobreingeniería'. Entonces con la lectura de la documentación hecha y con el ejemplo de Leo en mis narices, comencé a entender un poco mas que los de Spring no habían pecado de sobreingeniería, y podemos decir entonces que Spring Batch no es un framework sino un esqueleto para desarrollar progamas Batch de una manera simple, entendible y mantenible, y además tiene algunas implementaciones del esqueleto muy buenas. Vamos entonces con Spring Batch en 2 palabras Afortunadamente, el modelo de objetos que tiene Spring Batch lo explican los nombres por sí mismo. Vamos a tratar de enumerar los más importantes y para vincularlos entre sí: Un Job (Trabajo) se compone de uno o más Step's (Pasos). Un JobInstance representa un determinado Job, parametrizado con un conjunto de propiedades llamados JobParameters. Cada ejecución de una JobInstance es una JobExecution. Imagine un trabajo de lectura de entradas de una base de datos y la generación de un XML que represente la misma y, a continuación, haciendo algo para limpiarla. Por ejemplo, pensemos un Job compuesto de 2 Step's: lectura / escritura y la limpieza. Si parametriza este Job por la fecha de los datos generados, entonces nuestro Job del Viernes 13 es una JobInstance. Cada vez que ejecute este ejemplo (si se produce un error, para la instancia) es una JobExecution. Este modelo ofrece una gran flexibilidad respecto a cómo los Job se inician y se ponen en marcha. Naturalmente, esto nos lleva a iniciar sus trabajos con los parámetros de empleo, que es responsabilidad del JobLauncher. Por último, diversos objetos en el framework requieren un JobRepository para almacenar en tiempo de ejecución información relacionada con la ejecución batch. De hecho, el modelo de dominio de Spring Batch es mucho más elaborado pero esto será suficiente por ahora. Writers, Readers o Transformers Spring Batch viene por defecto con diferentes tipos de Readers para leer ficheros planos, XML o datos de base de datos. Estos Readers se configuran con una especie de mapeo entre registros y objetos. Por ejemplo, un archivo de planetas separado por comas, como el siguiente: 10,Mercurio,4879,rocoso,mensajero 20,Venus,12103,telurico,diosa del 30,Tierra,12875,telurico,madre de 40,Marte,6794,telurico,dios de la de los dioses amor y de la belleza todos los dioses guerra Podría ser interpretado en objetos como: public class Planeta { private int codigo; private String nombre; private long diametro; private String tipo; private String significado; .... } Esos datos podrían por ejemplo ser transformados con cadenas de transformadores en base a diferentes reglas y posteriormente almacenados utilizando un Writer a base de datos con su correspondiente mapeo entre los diferentes campos y las columnas de una tabla que recoja esos datos. Un Hola Mundo con Spring Batch Vamos entonces a realizar el clásico "Hola, Mundo" con Spring Batch. Básicamente crearemos un Job que contendrá 3 Steps: 1. 2. 3. imprimir "Hola, " imprimir "Mundo" imprimir "!!!" En código deberemos programar dos archivos: • • spring-batch-demo.xml, el contexto de Spring donde configuraremos Spring Batch, los Jobs y demás beans. ImprimirTasklet.java, que será la clase con la lógica para imprimir por consola un mensaje cualquiera. Configuración básica Por cada Job, vamos a utilizar un bean de Spring separado que lo representa. Hay también una serie de objetos comunes que vamos a necesitar usualmente. Vamos a ir a través de estos objetos comunes: JobLauncher Los JobLaunchers son responsables de iniciar un trabajo con determinados parámetros. Existe una implementación prevista, SimpleJobLauncher, que se basa en una TaskExecutor para poner en marcha los trabajos. Si no específico TaskExecutor, se setea entonces un SyncTaskExecutor para utilizarlo. JobRepository Un JobRepository es el encargado de almacenar información sobre la corrida de los Jobs. Vamos a utilizar la implementación MapJobRepositoryFactoryBean que guarda la información de las ejecuciones en memoria. En una implementación real, donde se quiere guardar en forma persistente esta información, se puede usar la implementación JobRepositoryFactoryBean la cual utiliza una base de datos para almacenar toda la corrida. Spring Batch utiliza un modelo de datos con tablas propias para este fin. configurados para imprimir distintos mensajes <bean id="trabajoBatch" class="org. public String getMensaje() { return mensaje. a continuación agregaremos a nuestra configuración anterior: • • • un SimpleJob tres TaskletStep.mensaje = mensaje. necesitamos un TaskletStep.batch.TaskletStep"> .xml <beans> <bean id="transactionManager" class="org.core. Con el fin de conectar un tasklet a un Job.tasklet.batch.launch. En este ejemplo.support. return ExitStatus.batch.MapJobRepositoryFactoryBean"> <property name="transactionManager" ref="transactionManager"/> </bean> <bean id="jobLauncher" class="org. que referencian a nuestros Tasklet tres Tasklet. } public void setMensaje(String mensaje) { this.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository"/> </bean> </beans> Los tasklets del Hola Mundo Un Tasklet es un objeto que contiene cualquier lógica que será ejecutada como parte de un trabajo. core.springframework. Aquí está nuestro spring-batch-demo.springframework.core. llamada ResourcelessTransactionManager. Vamos a aplicar una tasklet que simplemente imprime un mensaje por consola: public class ImprimirTasklet implements Tasklet { private String mensaje.ResourcelessTransactionManager"/> <bean id="jobRepository" class="org. Los Tasklet son la forma más simple en Spring Batch para ejecuar código.step.springframework.batch. } public ExitStatus execute() throws Exception { System. Es decir. core.out.SimpleJob"> <property name="steps"> <list> <bean id="primerPaso" class="org. pero lo utiliza el JobRepository para manejar las transacciones. como no accederemos a ningún medio transaccional.TransactionManager No es un bean propio de Spring Batch.transaction.springframework.repository. Los Tasklets se construyen mediante la implementación de la interfaz Tasklet.print(mensaje).support. support.batch. } } Tengan en cuenta que al ejecutar el método devuelve un ExitStatus para indicar el estado de la ejecución de la Tasklet.job. Usaremos la implementación SimpleJob que ejecuta todos los pasos secuencialmente.springframework.FINISHED. usaremos una implementación "dummy" del transaction manager ya provista por Spring Batch. Vamos a definir nuestro primer Job ahora en el XML de la aplicación. xml" }) public class ImprimirHolaMundoTest { @Autowired private SimpleJobLauncher launcher.demo0.springframework. new Date()). builder. y veremos por consola el mensaje "Hola.addString("jobName".dosideas.addDate("Ejecucion". e inicie una corrida del Job. @Test public void iniciarJob() throws Exception { JobParametersBuilder builder = new JobParametersBuilder().CommandLineJobRunner spring-batch-demo.core.dosideas.xml trabajoBatch Curso de Spring Batch y descarga de un proyecto de ejemplo . @RunWith(SpringJUnit4ClassRunner. parameters).demo0.springbatch.TaskletStep"> <property name="jobRepository" ref="jobRepository"/> <property name="tasklet" ref="imprimirMundo"/> </bean> <bean id="tercerPaso" class="org.toJobParameters(). Para esto crearemos un test JUnit que obtenga una instancia del JobLauncher.springframework.core.dosideas.ImprimirTasklet"> <property name="mensaje" value="Hola. } } Y listo! Este test ejecutará la tarea.class) @ContextConfiguration(locations = { "classpath:/com/dosideas/springbatch/demo0/spring-batch-demo.support. builder.batch. " /> </bean> <bean id="imprimirMundo" class="com.ImprimirTasklet"> <property name="mensaje" value="!!!" /> </bean> Ejecutando el Job Ahora tenemos que hacer algo para poner en marcha la ejecución de nuestros Trabajos.ImprimirTasklet"> <property name="mensaje" value="Mundo" /> </bean> <bean id="imprimirExclamacion" class="com.springframework. En su forma más simple esta clase tiene de 2 argumentos: el XML de contexto de la aplicación que contiene el Job para poner en marcha y el id de ese Job.TaskletStep"> <property name="jobRepository" ref="jobRepository"/> <property name="tasklet" ref="imprimirExclamacion"/> </bean> </list> </property> <property name="restartable" value="true" /> <property name="jobRepository" ref="jobRepository" /> </bean> <bean id="imprimirHola" class="com.batch. requiere un JobLauncher que es configurado en el mismo XML.batch. java org.springbatch. @Autowired private SimpleJob job.core. A continuación se muestra cómo iniciar el trabajo desde la linea de comandos (necesita especificar el classpath): launcher. Naturalmente.<property name="jobRepository" ref="jobRepository"/> <property name="tasklet" ref="imprimirHola" /> </bean> <bean id="segundoPaso" class="org. Spring Batch también ofrece una clase conveniente para ejecutarse desde la línea de comandos: CommandLineJobRunner.springbatch.run(job.step.tasklet. Mundo!!!".launch.demo0. "Imprimir hola mundo por consola"). JobParameters parameters = builder.step.tasklet. springbatch.NotWritableProp ertyException: Invalid property \'transactionMana ger\' of bean class [org. builder.beans. Adaptado libremente de Spring Batch Hello World.addDate("Ejecucion".run(job.factory. Recordá que si estás ejecutando desde un \"main\" tenés que iniciar el factory de Spring de manera adecuada (en el ejemplo de descarga.BeanCreationExc eption: Error creating bean with name \'jobRepository\' defined in class path resource [spring-batchdemo.springframework . Por ejemplo. JobParameters parameters = builder.support. } #7 leito 23-09-2008 18:12 Si tu pregunta es cómo iniciar el Job del \"hola mundo\" desde una clase de tu aplicación. En la clase de tu aplicación tenés que inyectar un SimpleJobLaunch er. En todo caso. sino vas a tener que levantar Spring dentro de tu aplicación). nested exception is org. corriendo el test de helloworld obtengo un: org. y el último paso podría ordenar estos datos con un query y guardarlos en un archivo de texto nuevamente.dosideas. que va a ser más claro. SimpleJobLaunch er launcher = (SimpleJobLaunc h er) context.MapJobRepositor yFactoryBean]: Bean property \'transactionMana ger\' is not writable or has an invalid setter method. Si tenés más dudas te invito a seguirlo en el foro de Java (www.xml"). Comentarios El siguiente main() lo podés ubicar en la clase com. #2 leito 09-09-2008 05:49 En el proyecto para descargar hay ejemplos más concretos con uso de archivos y bases de datos.com/foros. new Date()).batch.core. se podría modificar cada uno de los 3 pasos para que hagan cosas diferentes. el segundo paso podría transformar estos datos de la tabla.addString("jobName".springframework . junto a varios ejemplos más que demuestran distintos aspectos de Spring Batch. es bastante simple.getBean("jobLauncher").Para ver más detalles pueden descargar el proyecto de ejemplo de Spring Batch. el factory se inicia desde el mismo test JUnit). Does the parameter type of the setter match the return type of the getter? ¿sabés que puede estar mal en el context? #4 leito 18-09-2008 11:42 Fijate que en el proyecto de demo para descargar. en el paquete \"demo4\" hay justamente un ejemplo de lectura de una base de datos y escritura en un archivo.springframework . Esta descarga contiene el ejemplo aquí comentado en forma completa. volviendo al \"Hola Mundo\".getBean("trabajoBatch"). SimpleJob job = (SimpleJob) context.beans. y después ejecutar las mismas líneas que en el ejemplo de esta nota. "Imprimir hola mundo por consola"). el primer paso podría leer un archivo y subirlo a una tabla.xml]: Error setting property values.toJobParameters (). launcher. #5 No puedo correr el test — 23-09-2008 07:05 Hola. builder. y todas las librerias necesarias para su funcionamiento. JobParametersBu ilder builder = new JobParametersBu ilder().ImprimirTasklet : public static void main(String[] args) throws Exception { ApplicationCont ext context = new ClassPathXmlApp licationCont ext("classpath:/com/dosideas/springbatch/demo0/spring-batch-demo.dosideas. Es decir. Proximamente vamos a explicar más en detalle estos ejemplos.demo0.html?func=showcat&catid=2). publicamos el curso Procesamiento con Spring Batch. donde repasamos las distintas características de este framework y explicamos el proyecto de ejemplo en detalle. . parameters).repository. Además. el código para ejecutar el Job es el mismo desde un test o desde tu aplicación (siempre considerando que tu aplicación use Spring. 0 Spring Batch es el framework para procesamiento de lotes de Spring Framework. Un primer Hola Mundo con Tasklets. • • Proyecto de ejemplo de Spring Batch archivo Configuración del entorno Recurso 2 Demo #0: Hola Mundo Spring Batch es un framework para el procesamiento por lotes (o ejecuciones "batch"). demo1. Escritura en archivos. Toda esta guía se basa en torno a un proyecto con ejemplos de Spring Batch. demo3. etc. 1A su vez. Este framework apunta a crear una plataforma que brinde servicios comunes para los programas batch.Procesamiento con Spring Batch 2. el cual contiene distintos casos de uso. Lectura de archivos. demo2. Sobre el proyecto de ejemplo El proyecto de ejemplo para descargar está dividido en paquetes independientes llamado demo0. Lectura de base de datos. Dudas y consultas Realizá todas las consultas que necesites en el foro "Java" de Dos Ideas. Cada demo es un ejemplo autocontenido que utiliza distintas funciones de Spring Batch. cada paquete demo tiene asociado un test JUnit que lo ejecuta. Transformación de datos. explicando en detalle los conceptos nuevos y su funcionamiento. En los siguientes capítulos vamos a ir avanzando por cada una de estos paquete demo. Este curso es una guía para ir aprendiendo las diferentes características de Spring Batch 2. Spring Batch provee: • • un marco general para la creación de programas batch. Cada paquete es independiente y contiene todas las clases y archivos de configuración para funcionar. ¡Siempre va a haber alguien para darte una mano! Configuración del proyecto Antes de comenzar descargaremos el proyecto de ejemplo (el cual contiene además todas las librerias necesarias) y configuraremos la base de datos que usaremos durante el curso. Iremos explicando cada caso por separado. . almacenamiento de la información de ejecuciones. Los fuentes se encuentran en el directorio src y los tests en el directorio test. partiendo de ejemplos concretos.0. Durante el curso veremos: • • • • • • Conceptos básicos de Spring Batch. los cuales se ejecutan secuencialmente. El bean planetaFieldSetMapper indica que se usará la clase Planeta para transformar cada línea del archivo. que será el encargado de procesar cada una de las líneas convertidas a Planeta por planetaItemReader.xml se ecuentra toda la configuración necesaria para Spring Batch. llamado imprimirPorConsola. Es el trabajo batch. consolaItemWriter. Step: es un paso dentro de un Job. escribir en una base de datos. • • Conceptos básicos y demo0: Hola Mundo archivo Spring Batch en la wiki de Dos Ideas archivo Demo #1: lectura de archivos En el paquete "demo1" veremos como poder leer un archivo de texto separado por comas (archivo "planetas. JobExecution). JobInstance. Los beans importantes declarados en este archivo: • • • • jobRepository. Step. Usualmente es una base de datos con tablas propias de Spring Batch. para generar un nuevo archivo resultante. y una explicación de la demo0 del proyecto. El bean imprimirPorConsola contiene un lector de items (itemReader) y un procesador de items (itemWriter). Representa una acción dentro de todo el Job. Luego imprimiremos ese objeto por consola. que será el repositorio para las ejecuciones de nuestra tarea. En el recurso siguiente vas a encontrar más información sobre estos conceptos básicos. planetaItemReader. realizar una transformación. Las clases Para esto deberemos desarrollar dos clases: • • 3 Planeta. etc. Hace referencia a un único Step (Paso). y transformar cada línea a un objeto Planeta. que será el encargado de leer el archivo de texto separado por comas.csv"). que representa cada una de las líneas del archivo. trabajoBatch. Está compuesto de uno o más Step (pasos). el cual imprime por consola un objeto Planeta.• • utilización de conceptos conocidos para el procesamiento batch (Job. JobRepository: es un repositorio donde se almacenan las ejecuciones de los Job. etc). 4 Demo #2: transformación de archivos En el paquete demo2 veremos cómo leer un archivo de texto y realizar una transformación sobre cada una de las líneas. Un step puede leer un archivo. utilidades para realizar acciones comunes en procesamietos batch (lectura/escritura de archivos. y transformaremos cada línea a un objeto que la represente. Este bean registrará en la base de datos información sobre la corrida. La configuración En el archivo de configuración spring-batch-demo. Los conceptos principales de Spring Batch son: • • • Job: representa un trabajo a ejecutar. . que es el Job (Trabajo) en cuestión. acceso a base de datos. El test ubicado en el paquete demo1 ejecuta esta tarea. ConsolaItemWriter. que es un ItemReader que se encarga de leer el archivo de origen y convertir cada línea en un objeto Planeta. Los beans importantes declarados en este archivo: • • • trabajoBatch.Las clases Para esta solución se programan dos clases: • • Planeta. consolaItemWriter. ConsolaItemWriter. Las clases Para esto deberemos desarrollar dos clases: 5 • • Planeta. el cual imprime por consola un objeto Planeta.xml del paquete se ecuentra toda la configuración necesaria para Spring Batch. que representa cada una de las líneas del archivo. Los beans importantes declarados en este archivo: • • • convertirArchivo. 6 Demo #4: exportando una tabla hacia archivo En la demo del paquete demo3 encontraremos cómo acceder a una base de datos utilizando un query SQL. que será el encargado de ejecutar un query y transformar cada una de las filas en un objeto Planeta. que representa cada una de las filas resultantes del query. La configuración En el archivo de configuración spring-batch-demo. que es el Job (Trabajo) en cuestión. La configuración En el archivo de configuración spring-batch-demo. El bean imprimirPorConsola contiene un lector de items (itemReader) y un procesador de items (itemWriter). PlanetaFieldSetCreator. Demo #3: acceso a una base de datos En la demo del paquete demo3 encontraremos cómo acceder a una base de datos utilizando un query SQL. convertir cada fila del resultado en un objeto y finalmente imprimirlo por consola. que será el encargado de procesar e imprimir por consola cada uno de los Planeta creados por planetaItemWriter. archivoPlanoItemWriter. convertir cada fila del resultado en un objeto y finalmente imprimirlo por consola. que se encargará de transformar un objeto Planeta en una linea nueva para el archivo resultante. . el cual es un paso que tiene un lector de items (itemReader) y un procesador de items (itemWriter). Las clases Para esto deberemos desarrollar dos clases: • Planeta.xml se ecuentra toda la configuración necesaria para Spring Batch. que es un ItemWriter que se encargará de tomar un Planeta y convertirlo a una línea de este archivo. planetaItemReader. planetaItemReader. Para hacer esto utiliza un fieldSetCreator creado por nosotros: la clase PlanetaFieldSetCreator. llamado imprimirPorConsola. Hace referencia a un único Step (Paso). que representa cada una de las filas resultantes del query. que contiene el método que persiste cada objeto planeta en el índice lucene. el cual contiene un bean con un lector de items (itemReader) y un procesador de items (itemWriter). Los beans importantes declarados en este archivo: • • • trabajoBatch. Las clases Las clases destacadas para esta demo son: • 7 Planeta. sino que se debería continuar con la siguiente línea del archivo. Es importante tener en cuenta que cualquier exception lanzada durante la ejecución del job por defecto corta la ejecución del mismo. Hace referencia a un único Step (Paso). 8 Demo #6: Manejo de excepciones La demo del paquete demo6 amplía la demo1 (lectura de archivo e impresión por consola). planetaItemReader. se convierte cada uno en un objeto planeta y por ultimo se crea el índice lucene que contendrá la información de los objetos. La configuración En el archivo de configuración spring-batch-demo.xml se ecuentra toda la configuración necesaria para Spring Batch. en esta clase nos vemos obligados a implementar métodos abstractos para las acciones a seguir en caso de error en el reader. que será el encargado de procesar cada uno de los Planeta leídos por planetaItemReader y generar una línea en el archivo de texto resultante. que es el Job (Trabajo) en cuestión. Por extender de la clase de spring batch ItemListenerSupport. que representa cada una de las filas resultantes del Query y contiene las anotaciones de compass que nos permiten persistir y consultar la misma en los índices lucene. archivoPlanoItemWriter. ambos están creados con clases que extienden de CompassDaoSupport y es por esto que se les injecta la factory de compass. El segundo “leerIndice” realiza una búsqueda en el índice e imprime el resultado por pantalla. que se encargará de transformar un objeto Planeta en una línea nueva para el archivo resultante La configuración En el archivo de configuración spring-batch-demo. IndiceItemReader. es la factory de compass que nos permitirá trabajar con los índices. Las clases La única clase destacada para esta demo es: • PlanetaItemListener. considerando que algunas líneas del archivo de entrada podrían ser incorrectas desde el punto de vista del formato y ese no debería ser motivo para finalizar el job.• PlanetaFieldSetCreator. Compass. en el procesor y en el writer. Demo #5: integración con Compass y Lucene Esta demo consta de dos steps. planetaItemWriter y indiceItemReader. • • CompassItemWriter. donde definimos el Query y el mapeo de la clase Planeta. Este listener . que será el encargado de ejecutar un query y transformar cada una de las filas en un objeto Planeta.xml se encuentra toda la configuración necesaria para Spring Batch. que contiene el método que realiza las consultas en los índices aplicando paginación. Beans importantes declarados en este archivo: • • • planetaItemReader. el primero “guardarIndice” donde se obtienen los registros de la tabla PLANETA. que nos lleva a definir acciones a realizar antes del reader. planetaItemReader. Spring batch provee otros tipos de listeners que podemos implementar. sino que se continúa con el siguiente item sin realizar un rollback del chunk que se está procesando. el cual contiene un bean con un lector de items (itemReader) y un procesador de items (itemWriter). que será el encargado de procesar cada uno de los Planeta leídos por planetaItemReader y generar una línea en el archivo de texto resultante. Para esto se utiliza la interfaz ItemProcessor. en el cual se indica que este step será ejecutado por 3 hilos concurrentes. lista de listeners asociados al step. que será el encargado de ejecutar un query y transformar cada una de las filas en un objeto Planeta. con el mismo código Java. cantidad máxima de items que podrán saltearse debido a las excepciones “permitidas”. Demo #7: ejecución en multihilos La demo del paquete demo5 es básicamente la misma que la del paquete demo1 (lectura de archivo e impresión por consola). La cantidad de hilos que se ejecutan se configura en el Step (paso). La configuración En el archivo de configuración spring-batch-demo. Los beans importantes declarados en este archivo: • • • trabajoBatchMultithread. En su lugar estamos utilizando una implementación más compleja: FaultTolerantStepFactoryBean. En el ejemplo se ha desarrollado un listener como handler de errores (PlanetaItemListener). este Step tiene configurado un taskExecutor. pero con la incorporación de una ejecución concurrente por configuración. La demo del paquete demo8 contiene un ejemplo para realizar procesamiento de datos.xml se ecuentra toda la configuración necesaria para Spring Batch.es entonces un handler de los errores que sucedan durante la ejecución del job.xml se ecuentra toda la configuración necesaria para Spring Batch. Además. Para más información consultar la API de Spring Batch. después del reader y en caso de fallo en el reader. que provee funcionalidad muy interesante para el manejo de fallos. notemos que en esta demo para el step no estamos utilizando la implementación más básica de spring batch (SimpleStepFactoryBean) como en las demos anteriores. En la demo sólo se imprime un warning por consola con las líneas del archivo que no pudieron ser parseadas correctamente. que recibe un objeto leído y devuelve un objeto . que representa cada una de las filas resultantes del query. A veces es necesario manipular los datos luego de ser 0 leídos y antes de escribirlos en el destino. listeners. Las clases Para esto deberemos desarrollar dos clases: 9 • • Planeta. que se encargará de transformar un objeto Planeta en una línea nueva para el archivo resultante La configuración En el archivo de configuración spring-batch-demo. Hace referencia a un único Step (Paso). Algunos de los atributos que pueden setearse son: ○ ○ ○ noRollbackExceptionClasses. PlanetaFieldSetCreator. Beans importantes declarados en este archivo: • imprimirPorConsola. indica la lista de excepciones “permitidas”: aquellas para las cuales no se corta la ejecución del job. e importante. como ItemReadListener. 1 Demo #8: procesamiento de datos procesado. skipLimit. archivoPlanoItemWriter. que es el Job (Trabajo) en cuestión. Para compartirlo lo guarda en el contexto del step. utilizando el contexto del step. es el PlanetaProcessor que se encarga de recibir un Planeta. Configuración del entorno Configuración del IDE Durante este curso usaremos NetBeans IDE 6. cuyo bean también está declarado como listener del step. Este contexto lo setea spring-batch al encontrar en un método la anotación @BeforeStep.5 como IDE para desarrollo y entorno de ejecución. Demo #9: leer archivos con cabecera y compartir datos entre etapas de un Step La demo del paquete demo9 contiene un ejemplo para leer archivos planos en los que se recibe una primera línea “cabecera” con datos generales del archivo y/o comunes a todos los registros.xml se ecuentra toda la configuración necesaria para Spring Batch. devolviendo un objeto Planeta por cada fila. que recibe un Planeta procesado (por el PlanetaProcessor) y lo muestra por consola. maneja el registro cabecera. Las clases Para esto deberemos desarrollar dos clases: • • • • Planeta. Los beans importantes declarados en este archivo: • • cabeceraHandler. ConsolaItemWriter.xml se ecuentra toda la configuración necesaria para Spring Batch. La configuración En el archivo de configuración spring-batch-demo. que representa cada una de las filas resultantes del query.El ItemProcessor se agrega como atributo de un Step (paso). es el CabeceraHandler que se encarga de manipular la cabecera y dejarla disponible para el writer. es el nuevo bean en el que se mapeará el registro cabecera. PlanetaProcessor. imprimirPorConsola. que se encargará leer planetas de la tabla en una base de datos. pasándo a mayúsculas sus atributos. que recibe un Planeta (leído por el PlanetaItemReader) y lo procesa. . Además es necesario que el bean esté declarado como listener en el step. Además veremos cómo se comparte información entre el reader y el writer. que es el Step que se encarga de leer los planetas (itemReader). Las clases Para esto deberemos desarrollar dos clases: 1 1 • • CabeceraHandler. leyéndolo y creando con sus datos el objeto de tipo CabeceraArchivo que se compartirá entre el reader y el writer. procesos sus atributos (pasarlos a mayúsculas) y devolver este Planeta procesado. La configuración En el archivo de configuración spring-batch-demo. cabeceraArchivo. procesarlos (itemProcessor) y escribirlos por consola (itemWriter). Los beans importantes declarados en este archivo: • • pasarAMayusculas. utiliza en esta ocacion los datos de la cabecera para imprimir por consola. PlanetaItemWriter. PlanetaItemReader. y las siguientes líneas son los registros que deben ser procesados individualmente. Abrir el archivo schema-derby. y comprobaremos su funcionamiento. Este conjunto de tareas sería un Job el cual estaría compuesto de tres Step. 4. clases. Con estos pasos tenemos todas las tablas creadas. un chache.. la cual ya viene embebida en NetBeans. 1. En “Spring Batch” un Job es un proceso que se encuentra compuesto por uno o más Step. 1. y ya podemos comenzar a utilizar las demos del proyecto. lo descomprimimos. 1.sql En el combo "connection" seleccionar la conexión a la base de datos creada anteriormente ( jdbc:derby://localhost:1527/springbatch ) Click en el ícono "Run SQL".…. Tenemos entonces la base de datos creada.. 2. Abrimos luego este proyecto con NetBeans 6. . Por ejemplo. Este modelo propuesto por “Spring Batch” permite a los desarrolladores una gran flexibilidad respecto a cómo nuestros Job serán lanzados y ejecutados.sql En el combo "connection" seleccionar la conexión a la base de datos creada anteriormente ( jdbc:derby://localhost:1527/springbatch ) Click en el ícono "Run SQL". le insertaremos los datos necesarios. hasta hoy que me decidí a como de lugar programar mis primeras líneas en” Spring Batch” (mas bien no jugar PS3 :-( …. 4.1 Configuración de la base de datos Usaremos Derby como base de datos.Lost Planet puede esperar). 3. Cada ejecución de una JobInstance será una JobExcecution. etc…). generar un archivo XML que represente a esa información e insertar este una cola de mensajería JMS. 2. Vamos a ejecutar los scripts para crear las tablas de Spring Batch y una tabla de ejemplo para el curso. proyectos de investigación. la cual nos permitirá definir un Job. 3. 2. Ir al menú Window > Services En el nodo Databases seleccionar Java DB > click derecho > create database. 1.• Descargar NetBeans IDE Una vez descargado el proyecto de ejemplo. A continuación crearemos una nueva base de datos.. asociándole un conjunto de propiedades llamadas JobParameters.etc) nunca he podido darme un tiempo.. 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. 3. 2. JUG.pero bueno….. Ejecutamos el script demo. cada periodo de tiempo seria una JobInstance y cada vez que se ejecute esta instancia (depende de la hora).. parametrizamos este Job para que se ejecute cada cierto periodo de tiempo (una hora por ejemplo). 2.sql: 1. Iniciar NetBeans IDE Abrir el proyecto de ejemplos.sql: 3.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”. ir al menú Window > Files Abrir la carpeta dosideas-spring-batch > scripts-sql Ejecutamos el script schema-derby. 4. pero por motivos de tiempo (trabajo. Abrir el archivo demo. 3. Database name: springbatch User name: springbatch Password: springbatch Click en Ok. Para construir un Job utilizaremos una JobInstance. supongamos que necesitamos cada cierto periodo de tiempo leer un información de un repositorio de datos (una base de datos. sería una JobExecution. Si además. <!-.El responsable de ejecutar cada uno de los Job definidos. 5. 4. JobExecutionDAO y StepExecutionDAO: Estos DAO serán usados por el SimpleJobRepository para almacenar información relacionada con la ejecución de los Job.springframework. 6.xml quedaria asi: 1.repository.dao. 9. 19. Estos objetos los agruparemos en el applicationContext.batch. 15. Si no se especifica el tipo de TaskExecutor se configurara un SyncTaskExecutor por defecto. 2.MapStepExecutionDao"> </constructor-arg> </bean> 16.springframework. <!-. para lo cual se utiliza un JobRepository.launch.dao. JobRepository: Para el manejo del repositorio utilizaremos un SimpleJobRepository.xml.repository.dao. además del grupo de parámetros asociados a este será el JobLauncher. 17.core. Para esto.full!!!).batch.support. Para cada Job es recomendable utilizar un archivo XML de contexto diferente (ya veo un modulo de procesos batch definido con Impala….DEFINICION DEL LANZADOR DE LOS JOB AL CUAL SE LE INJECTA EL REPOSITORIO --> <bean id="jobLauncher" class="org. Sin embargo.org/schema/beans" xsi="http://www.DEFINICION DEL REPOSITORIO PARA LOS JOB --> <bean id="jobRepository" class="org. la cual requerirá un conjunto de DAOs para almacenar la información.batch.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository"> </bean> 21.batch.springframework. </beans> . 18.springframework.MapJobInstanceDao"> </constructor-arg> <constructor-arg> <bean class="org.springframework.repository. Por último. en muchos casos. 7. 20. 11.MapJobExecutionDao"> </constructor-arg> <constructor-arg> <bean class="org. necesitaremos algún lugar donde poder almacenar información en tiempo de ejecución relacionada con el proceso batch. 13. 8. La implementación más básica se encuentra proveida por la clase SimpleJobLauncher. JobInstanceDAO.5.core.core. la cual se soporta en un TaskExecutor para iniciar cada uno de los Job. 10.springframework. los cuales serán importados desde cada una de las definiciones de los Job. 12. necesitaremos un conjunto de beans que serán utilizados por cada uno de estos Job. Es Los objetos comunes son: • • • JobLauncher: El cual será el responsable de iniciar un Job cargando cada uno de sus parámetros asociados.support. 14. En el archivo applicactionContext.or g/schema/beans/spring-beans-2.xsd"> 3.springframework.repository.org/2001/XMLSchemainstance" schemalocation="http://www.springframework.SimpleJobRepository"> <constructor-arg> <bean class="org.core.batch. “Spring Batch” provee dos tipos de implementación: basados en Map (se almacenan los datos en memoria) y en JDBC. <beans xmlns="http://www.core.org/schema/beans http://www.w3. print(mensaje).FINISHED. } public ExitStatus execute() throw s Exception { System.batch. package cl. 15. 19.core.springframew ork. 18.repeat.batch. 12. public class EjemploTasklet implements Tasklet { 8.out. 5. 6. 10. } 16.tasklet. 20. import org.jug. 1. @Override public ExitStatus execute() throws Exception { System. } public void setMensaje(String mensaje) { this. 14.repository. Dentro de esta clase programaremos la lógica que deberá ejecutar un Job. 4.mensaje = mensaje.springframework.mensaje = mensaje.print(mensaje).batch. 7. 17.springframew ork. } } Fíjense que el método “execute” retorna un ExitStatus para indicar el estado de ejecución del Tasklet. . return ExitStatus.d </constructor-arg> </bean> <!-.step.springframework. 13.c <property name="jobRepository" ref="jobRepository"> </bean> Para programar nuestro ejemplo.<constructor-arg> <bean class="org. } public void setMensaje(String mensaje) { this.batch. private String mensaje.DEFINICION DEL LANZADOR DE LOS JOB AL CUAL SE LE <bean id="jobLauncher" class="org. 11.Tasklet. import org.FINISHED. return ExitStatus.out. 2. que en nuestro caso será un mensaje por consola. 9.ExitStatus. la clase deberá implementar la interfaz Tasklet.core. 3. batch. <!-. Para poder definir un Tasklet dentro de un Job. 25. 24.DEFINICION DEL EJECUTOR DE LOS PASOS DE MANERA SECUENCIAL --> <bean id="taskletStep" abstract="true" class="org.core.job. 13.springframework."> </bean> 14.jug. 20. 32. 27. 34. deberemos utilizar un TaskletStep.cl .springframework. 26.xsd"> 3.cl"> </bean> 18.step.jug.xml. <import resource="applicationContext. <bean id="paso3" class="cl. 21. 8. 12. Dentro de este.core.DEFINICION DE CADA UNO DEL LOS PASOS A EJECUTAR --> <bean id="paso1" class="cl. <bean id="paso2" class="cl.jug. 17.w3. 11. 19. 2. 29.EjemploTasklet"> <property name="mensaje" value="[email protected]"> <property name="name" value="ejemploJob"> <property name="jobRepository" ref="jobRepository"> <property name="steps"> <list> <bean parent="taskletStep"> <property name="tasklet" ref="paso1"> </bean> <bean parent="taskletStep"> <property name="tasklet" ref="paso2"> </bean> .jug. <!-. utilizaremos la implementación de un SimpleJob la cual ejecutara todos los Step secuencialmente.org/schema/beans http://www."> </bean> 10. 1. 16.DEFINICION DEL JOB EL CUAL ESTA COMPUESTO DE TRES PASOS SECUENCIALES --> <bean id="ejemploJob" class="org. 6. <beans xmlns="http://www. 7.springframework.EjemploTasklet"> <property name="mensaje" value="Ejemplo de Spring Batch . 30. 9. 28. 4. 15.5.org/schema/beans" xsi="http://www. 33.EjemploTasklet"> <property name="mensaje" value="http://www.springframework.org/2001/XMLSchemainstance" schemalocation="http://www. 22. 31.tasklet.springframework.Ahora solo nos queda definir nuestro primer Job en un archivo de contexto que llamaremos EjemploBasicoJob.batch.org/sc hema/beans/spring-beans-2.TaskletStep"> <property name="jobRepository" ref="jobRepository"> </bean> 23. <!-.xml"> 5. En mi caso lo estoy ejecutando desde Eclipse. 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.jug. <bean parent="taskletStep"> <property name="tasklet" ref="paso3"> </bean> </list> </property> </bean> 42. Por último.xml"> <!-. 41.EjemploTasklet"> “Spring Batch” provee muchas formas de ejecutar un Job.35. 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.jug.springframew ork. </beans> <beans xmlns="http://w w w . 39.DEFINICION DE CADA UNO DEL LOS PASOS A EJECUTAR <bean id="paso1" class="cl. 37. .EjemploTasklet"> <property name="mensaje" value="Ejemplo de Spring Batch </bean> <bean id="paso2" class="cl. La más simple es utilizando la clase CommandLineJobRunner. 38. así que solo necesitao crear una nueva “Java Application” y en el “Main class” definir la clase CommandLineJobRunner. 36. 40.org/schema/bea <import resource="applicationContext. se puede aplicar a muchos entornos y problemas. te das cuenta de su modularidad. tuve la oportunidad de jugar. No sé que pasa que con este tipo de procesos periódicos. Y como tal. pero es que siempre que me ha tocado lidiar con algún proceso batch.SimpleJob"> <property name="steps"> <list> <!-. Esta es una herramienta realemente aplicable a un amplio número de procesos ya que se basa en unas abstracciones muy generales. no dejó de ser un juego. la cosa siempre se lía. . Desde luego. a fin de cuentas los batches son una de esas cosas que cuando te la nombran ya se te ponen los pelos como escarpias.springframework. después de desarrollar un pequeño batch con Spring Batch se da cuenta de que mmmm. y sobre todo conforme vas implementando algo de código.springframework. En especial en un mundo. Me explico. o un proceso que cierra cuentas de traders y envía informes a medianoche en Java. Cuando uno se enfrenta a la página principal y de features del framework. y los programas tienden a ser los más monolíticos. pero el caso es que es uno de esos frameworks oscuros que hacen su labor. o un proceso que extrae noticias de fuentes cada cinco minutos y las va procesando. es lo primero que pensé yo. Siempre es lo mismo.org/spring-batch/spring-batch-docs/reference/html/execution. Por eso uno. Describiéndolo muy rápidamente.core. ni es uno de los componentes más sexies o excitantes con los que uno se vaya a encontrar en su vida laboral.batch. con esta librería durante unos días. En mi opinión. Opinión sobre Spring Batch Tenía pendiente desde hace unos días escribir algo sobre uno de los componentes de Spring más desconocidos: Spring Batch. por fin creo que tengo delante de mi un batch realmente mantenible. Hace unas semanas.Step Bean details ommitted for clarity --> <bean id="playerload" parent="simpleStep" /> <bean id="gameLoad" parent="simpleStep" /> <bean id="playerSummarization" parent="simpleStep" /> </list> </property> <property name="restartable" value="true" /> </bean> Spring Batch se encargará de ejecutar estos trabajos y tareas y de repetirlos si se ha producido un error y cosas así.Más información respecto a ejemplo más complejos lo pueden consultar en http://static. Si estáis pensando que Spring Batch es una librería cuyo uso sólo se aplica a aplicaciones bancarias que procesen enormes cantidades de registros a medianoche. y la verdad es que tengo que reconocer que quedé mucho más satisfecho de lo que me experaba. Spring Batch ni suena. siempre ha sido la parte que a todos nos daba miedo tocar.job. Spring Batch define lo que son Trabajos que a su vez están definidos en tareas: <bean id="footballJob" class="org. el de los batches. Tanto da que sea un proceso que realiza un cálculo de gestión de costes cada mes. y vas comprendiendo sus conceptos. uno se queda con el sabor de boca de que está delante de algo en los que sus creadores se han pasado de rosca.html. conforme vas adentrándote en su documentación. estáis equivocados. quizás el diseño no sea excesivo. Spring Batch no es realmente un framework si no un esqueleto de aplicación de procesado de datos. donde literalmente "vale todo". incomprensibles y difíciles de mantener por lo general que uno se pueda encontrar. Aún así. sucios. es más. pero también de lo que quizás sea más importante: de guardar contabilidad de todo lo que ha pasado con estos trabajos y tareas en base de datos. Que conste que esto que pongo se basa única y exclusívamente en mi experiencia laboral (que no es realmente muy amplia). "Overengineered para lo que quiero hacer". STATUS JOB_EXECUTION_ID JOB_INSTANCE_ID START_TIME END_TIME FAILED 1 1 2008-01-01 21:00:23. String position. Por ejemplo.springframework.firstName.w3. es decir aplicaciones batch.xml <?xml version="1. para mi esto que he explicado es lo más importante.org/schema/util . será traducido en: public class Player implements Serializable { private private private private private private String ID.1974. A mayores Spring Batch ofrece muchas más cosas. Estos Readers se configuran con una especie de mapeo entre registros y objetos de modo que algo en principio complicado como: ID. Sin ningún esfuerzo estamos obteniendo una enorme transparencia y monitorabilidad en nuestra aplicación. que no quiero aburriros mucho.org/schema/beans/spring-beans-2. In the tutorial we have discussed about batchUpdate() method of class JdbcTemplate in Spring framework. context.org/schema/util" xmlns:tx="http://www.0. En fin.571 2008-01-01 21:30:17.1996". ofreciento artefactos para leer.debutYear "AbduKa00.birthYear.lastName. Por obra y gracia de Spring Batch. aunque tenga el coste inicial de comprender y acostumbrarse al framework.springframework. Lo genial de Spring Batch es que podríamos configurar estas tareas como repetibles en caso de error.springframework.Karim. saltarse o repetir tareas sobre estos datos.org/2001/XMLSchema-instance" xmlns:util="http://www. Spring Batch viene por defecto con diferentes tipos de Readers para leer ficheros planos.org/schema/aop" xmlns:lang="http://www. Esos datos podrían por ejemplo ser transformados con cadenas de transformadores en base a diferentes reglas y posteriormente almacenados utilizando un Writer a base de datos con su correspondiente mapeo entre los diferentes campos y las columnas de una tabla que recoja esos datos. XML o datos de base de datos. String lastName. String firstName. cada trabajo podrá utilizar diferentes Writers. Todo este trabajo nos permite hacer aplicaciones de tratamiento de datos. y para monitorizar el estado de las ejecuciones del proceso sobre estos datos. int birthYear.springframework. Readers o Transformers. int debutYear.org/schema/beans http://www. y que Spring Batch iría rellenando la tabla que veis arriba con los resultados de las diferentes ejecuciones. para ejecutar.springframework. Spring Batch Example JDBC Template Batch update example.springframework. Bueno.Abdul-Jabbar.springframework. tratar y almacenar estos datos.rb. por ejemplo si nuestro proceso batch fuera un demonio que lee noticias RSS de diferentes sitios web (por poner algo diferente a bancos y todo esto) y las almacena en base de datos.org/schema/lang" xsi:schemaLocation="http://www. parar.position. Tendríamos un trabajo (o varios) con diferentes tareas que se encargarían de recoger las noticias y almacenarlas.132 Así. The example given below consists of the code to delete and update data of the table Simultaneously.org/schema/tx" xmlns:aop="http://www. que realmente creo que la gente de Spring ha hecho un buen trabajo al recopilar patrones comunes en las aplicaciones de manejo de datos.0" encoding="UTF-8"?> <beans xmlns="http://www. realmente mantenibles.org/schema/beans" xmlns:xsi="http://www. The Batch update methods are used to executes multiple SQL updates query on a single JDBC Statement.xsd http://www.springframework. java ApplicationContext ac = new ClassPathXmlApplicationContext("context.JdbcTemplate. JdbcTemplate jt = new JdbcTemplate(source). This method executes multiple Sql updates on a single JDBC statement.xml".springframework. import org.apache.168.springframework.xsd http://www.springframework.springframework. Main.org/schema/aop http://www. Here we created datasource for making connection to our xml document in which we have declared the bean.jdbc.context.getBean("dataSource"):-Data source is an Interface which provides a way for connecting to the physical data source.org/schema/lang http://www.http://www. jt.10.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.org/schema/aop/spring-aop-2. import org.0. Here we Creates an instance of this interface to access context.jdbc.ApplicationContext. "delete from employee where EmployeeId =31" }).core.springframework.springframework.OracleLobHandler"> <property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/> </bean> <bean id="nativeJdbcExtractor" class="org.springframework.0.springframework.nativejdbc. System.org/schema/util/spring-util-2.sql.75:3306/komal"/> <property name="username" value="root"/> <property name="password" value="root"/> </bean> <bean id="lobHandler" class="org.context.springframework.support.lob.commons.out.xsd"> <bean id="dataSource" class="org.org/schema/tx http://www.0. } catch (Exception e) { .DataSource.class).support.getBean("dataSource").jdbc.CommonsDbcpNativeJdbcExtractor"/> <bean id="jdbcTemplate" class="org.0.core.xml".println("Data updated successfully"). "delete from employee where EmployeeId =31" }):-With the use of this method we are executing two SQLquery simultaneously.java.org/schema/lang/spring-lang-2.class):-ApplicationContext is the interface that is used to provide Bean factory methods for accessing application components.springframework. DataSource source = (DataSource) ac.springframework. import org.springframework. class Main { public static void main(String args[]) { try { ApplicationContext ac = new ClassPathXmlApplicationContext("context.ClassPathXmlApplicationContext. Main. jt.batchUpdate(new String[]{"update employee set departement = 'Finance#'".xsd http://www.xsd http://www.jdbc.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> </beans> Main.org/schema/tx/spring-tx-2. DataSource source = (DataSource) ac.mysql.dbcp.support.xml and Main.jdbc.batchUpdate(new String[]{"update employee set departement = 'Finance#'". import javax.Driver"/> <property name="url" value="jdbc:mysql://192.springframework. Finalmente. toma más que 2 palabras and y me siento obligado a hacer una broma sobre ello. Spring Batch en 2 palabras Afortunadamente. lo cual es responsabilidad del JobLauncher. usaremos un archivo xml de definición de contexto separado. Tenemos un Job compuesto de 2 pasos: leer/escribir y limpiar. Los agruparé en un applicationContext. Antes de iniciar Todos los ejemplos tendrán la noble tarea de imprimir "Hola Mundo!" aunque en diferentes maneras. Una JobInstance representa un trabajo dado. Objetos Comunes Para cada job. 2008 Spring Batch . Bueno. Vamos a intentar enumerar los más importantes y a ligarlos juntos: Un Job batch está compuesto de uno o mas Steps.e. Así que vamos a movernos a la siguiente sección. pero no la haré. varios objecos en el framework requieren un JobRepository para almacenar información de tiempo de ejecución relacionada a la ejecución batch. Spring Batch es completamente rico en functionalidades. y así es básicamente como empecé a aprenderlo. Sin embargo hay un número de objetos comunes que necesitaremos recurrentemente. Si parametrizamos este job por la fecha de los datos generados entonces nuestro job del Vienres 13 es una JobInstance. Mantén en mente que solo estarás rasgando la superficie.Hello World Este es un tutorial introductorio a Spring Batch. el modelo de dominio de Spring Batch es mucho más elaborado pero esto será suficiente para nuestros propósitos. Este modelo ofrece una gran flexibilidad con respecto a cómo los jobs sean lanzados y corridos. De hecho. Fueron desarrolados con Spring Batch 1. June 2. Esto por ejemplo nos trae lanzar jobs con sus propios parametros de job.xml el cual será importado dentro de las definiciones del trabajo. el modelo de objetos de Spring Batch tiene nombres autoexplicativos. Vamos a ver estos objetos comunes: . } } } Output of the program Data updated successfully BUILD SUCCESSFUL (total time: 2 seconds) Table before updation Table after updation Monday. Proveeré un proyecto Maven 2 y correré los ejemplos con Maven pero de hecho no es un requerimiento trabajar con Spring Batch. Imagina un job leyendo entradas desde una base de datos y generando una representación xml de ello y luego hacer alguna limpieza. parametrizado con un conjunto de propiedades tipeadas llamadas JobParameters. No provee una guía completa al framework pero facilita el primer contacto.0. Cada corrida de una JobInstance es una JobExecution. Cada vez que corramos esta instancia (por ejemplo si una falla ocurre) es una JobExecution.printStackTrace(). Los tasklets son construidos implementando la interfaz Tasklet.springfr amework. se basa en un TaskExecutor para lanzar los jobs.out.core.xml: <beans xmlns="http://www. En una aplicación real las variantes de Jdbc son más adecuadas pero usaremos la alternativa en-memoria más simple en este ejemplo. JobRepository Usaremos la implementación SimpleJobRepository la cual requiere un set de Daos de ejecución para almacenar su información.batch.springframework.batch.repository.w3.launch.MapStepExecutionDao"/> </constructor-arg> </bean> </beans> Hola Mundo con Tasklets Un tasklet es un objeto que contiene alguna lógica personalizada para ser ejecutada como parte de un job.springframework.print(message). JobExecutionDao.repository. La implementación proveida.springframework.batch.core.org/schema/beans" xmlns:xsi="http://www.dao. .org/schema/beans/spring-beans-2.springframework. public void setMessage(String message) { this. Si no lo especificamos TaskExecutor es asignado entonces y se usa un SyncTaskExecutor.core.5. JobInstanceDao.dao.core.xsd"> <bean id="jobLauncher" class="org.springframework.SimpleJobLauncher"> <property name="jobRepository" ref="jobRepository"/> </bean> <bean id="jobRepository" class="org. Aquí esta nuestro applicationContext.repository.batch.support. } public ExitStatus execute() throws Exception { System.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.FINISHED.dao. StepExecutionDao Estos objetos de acceso a datos son usados por SimpleJobRepository para almacenar información relacionada a la ejecución.MapJobExecutionDao" /> </constructor-arg> <constructor-arg> <bean class="org.JobLauncher Los JobLaunchers son responsables de iniciar un Job con unos parámetros de job dados.springframework.batch.message = message. return ExitStatus.SimpleJobRepository"> <constructor-arg> <bean class="org.support.MapJobInstanceDao"/> </constructor-arg> <constructor-arg> <bean class="org. SimpleJobLauncher.org/schema/beanshttp://www. Se proveen dos conjuntos de implementaciones por Spring Batch: Basadas en Map (en-memoria) y basadas en Jdbc. Vamos a implementar un simple tasklet que solamente imprime un mensaje: public class PrintTasklet implements Tasklet{ private String message.repository.core.springframework. org/schema/beanshttp://www. Usaremos la implementación SimpleJob que ejecuta todos sus pasos secuencialmente. En su forma mas simple toma 2 argumentos: el contexto de aplicación xml que contiene el job a lanzar y el id del bean de ese job.tasklet.PrintTasklet"> <property name="message" value="Hello"/> </bean> <bean id="space" class="helloworld.TaskletStep"> <property name="jobRepository" ref="jobRepository"/> </bean> <bean id="simpleJob" class="org.PrintTasklet"> <property name="message" value="World!"/> </bean> <bean id="taskletStep" abstract="true" class="org.core.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.core.step. También agregué la definición de un bean abstracto para los pasos del tasklet con el fin de simplificar la configuracion: <beans xmlns="http://www.batch.SimpleJob"> <property name="name" value="simpleJob" /> <property name="steps"> <list> <bean parent="taskletStep"> <property name="tasklet" ref="hello"/> </bean> <bean parent="taskletStep"> <property name="tasklet" ref="space"/> </bean> <bean parent="taskletStep">.springframework. necesitamos un TaskletStep.xsd"> <import resource="applicationContext.job.xml"/> <bean id="hello" class="helloworld.batch.xml.springframework. Con el fin de conectar un tasklet en un job. <property name="tasklet" ref="world"/> </bean> </list> </property> <property name="jobRepository" ref="jobRepository"/> </bean> </beans> Corriendo el Job Ahora necesitamos algo para poner en marcha la ejecución de nuestros jobs.org/schema/beans/spring-beans-2. Naturalmente requiere un JobLauncher para ser configurado enel contexto de la aplicación.w3.springframework. Aquí está el .PrintTasklet"> <property name="message" value=" "/> </bean> <bean id="world" class="helloworld. Definiremos nuestro primer job ahora en un contexto de aplicación simpleJob.springframework .5.} } Nota que el método execute retorna un ExitStatus para indicar el estatus de la ejecución del tasklet.springframework.org/schema/beans" xmlns:xsi="http://www. Spring Batch provee una clase conveniente para llevar a cabo eso desde la línea de comandos: CommandLineJobRunner. args="simpleJob.support.cómo lanzar el job con Maven.springframework.launch.core. Escrito por Tareq Abed Rabbo Traducido por Abimael Desales López .xml simpleJob" Esperemos que. puede ser corrido directamente con el comando java (entonces necesitas especificar la ruta de la clase): mvn exec:java -Dexec.batch. El codigo fuente puede ser descargado aqui.mainClass=org. De hecho.CommandLineJobRunner -Dexec. sus esfuerzos sean recompensados con un "Hola Mundo!" impreso en la consola.
Copyright © 2024 DOKUMEN.SITE Inc.