Procesamiento Batch con Spring Cloud Data Flow
En un artículo anterior de refactorizando hablamos sobre Spring Cloud Data Flow en el procesamiento de streams y su arquitectura. En este nuevo artículo vamos a ver como funciona mediante un ejemplo una introducción a procesamiento Batch con Spring Cloud Data Flow.
¿Qué es Spring Cloud Data Flow?
Spring Cloud Data Flow es un proyecto de Spring Cloud que básicamente se va a encargar de realizar procesamiento de datos de dos formas diferentes, a través de streaming o por Batch.
¿Cómo funciona Spring Cloud Data Flow Batch?
Spring Cloud Data Flow Batch nos proporciona una monitorización de ejecución así como un registro de tareas. Spring Cloud Data Flow se va a encargar de comunicarse con el Cloud en el que se encuentre desplegado para lanzar un job y poder ir persistiendo en la base de datos de Spring Cloud Data Flow su estado. Aunque también lo podemos probar en local levantando un Local Data Flow Server y un Local Data Flow Shell (será lo que haremos para nuestro ejemplo).
En caso de que algún Job pueda llegar a fallar o no termine adecuadamente, Spring Cloud Data Flow puede continuar el proceso en el mismo punto donde se quedo.
Ejemplo con Spring Cloud Data Flow Batch
A continuación vamos a ver una simple aplicación en la cual crearemos un Job en el que contaremos los registros de nuestra base de datos.
Si quieres ver el ejemplo de código puedes echar un ojo aquí.
Configuración de Servidor de Spring Cloud Data Flow
Lo primero que necesitaríamos sería un servidor. Podemos arrancar de manera manual con la siguiente dependencia:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-dataflow-server-local</artifactId> </dependency>
O hacerlo a través de Docker con la imagen que se nos proporciona desde Spring. Para ello hacemos uso del Docker-compose que nos proporcionan.
Antes hay que realizar la configuración de HOST_MOUNT_PATH y DOCKER_MOUNT_PATH a través de variables para apuntar a nuestra carpeta .m2.
O lo podemos hacer con los .jar que podemos descargar desde aquí.
Una vez hemos arrancado nuestras imagenes podemos ejecutar la siguiente url: http://localhost:9393/dashboard
Configuración aplicación Spring Cloud Data Flow Batch
Una vez tenemos nuestro Servidor de Spring Cloud Data Flow (SCDF) funcionando, es momento de realizar la configuración para crear una aplicación y dotarla de la funcionalidad Batch. Para ello, vamos a spring initialzr y añadimos las dependencias que ves a continuación.
La dependencia importante que tenemos que tener en cuenta que se añade es la siguiente:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId> </dependency>
Como podemos ver arriba vamos a usar por defecto en Local la Base de Datos H2, es una Base de Datos embebida, que es la Base de Datos por defecto de Spring Cloud Data Flow. En caso que queramos usar otro tipo de Base de Datos habrá que realizar esa configuración al arrancar el jar del servidor o en el docker-compose.
Una vez tenemos las dependencias para nuestra aplicación tenemos que añadir las siguientes anotaciones en nuestra clase main de nuestro proyecto:
- @EnableTask
- @EnableBatchProcessing
De manera que quedaría así:
@EnableTask @EnableBatchProcessing @SpringBootApplication public class BatchJobApplication { public static void main(String[] args) { SpringApplication.run(BatchJobApplication.class, args); } }
Configuración de Job
Una vez hemos realizado los pasos anteriores es momento de crear el Job de nuestra aplicación.
Un job es un grupo o grupos de acciones que llevan a cabo un procesamiento en el sistema, estas acciones pueden llevar interacción con el usuario. Aquellos jobs que no tienen ningún tipo de interacción pueden ser procesadas como batchs.
Nuestro Job va a consistir en una tarea que guarda en Base de Datos un Mensaje con un texto random.
public class RecordJob { private final JobBuilderFactory jobBuilderFactory; private final StepBuilderFactory stepBuilderFactory; private final RecordRepository repository; @Bean public Job job() { return jobBuilderFactory .get("job") .start(stepBuilderFactory .get("jobStep1").tasklet((contribution, chunkContext) -> { log.info("Job was run"); byte[] array = new byte[20]; new Random().nextBytes(array); String randomText = new String(array, Charset.forName("UTF-8")); RecordEntity recordEntity = new RecordEntity(); recordEntity.setMessage("This is a random message " + randomText); repository.save(recordEntity); return RepeatStatus.FINISHED;} ) .build()).build(); } }
Esto sería todo lo necesario para tener una aplicación que pueda funcionar como Batch.
El siguiente paso sería registrarla en nuestro servidor que tenemos levantado.
Resgistrar nuestro Batch en Spring Cloud Data Flow
Este paso es imprescindible para poder monitorizar y registrar nuestra aplicación como Spring Cloud Data Flow.
Para ello lo primero es asegurarnos que podemos acceder a la interfaz de Spring Cloud Data Flow levantada en el paso anterior en el puerto 9393 (http://localhost:9393/dashboard)
Para registrar nuestra aplicación lo primero que vamos a hacer es por ejemplo, un mvn clean install para generar un jar; y una vez generado lo podremos registrar de la siguiente manera haciendo uso del cliente de Spring Cloud Data Flow:
app register --name batch-job --type task --uri maven://com.refactorizando.example.batch-processing:0.0.1-SNAPSHOT
La uri específicada debe llevar el formato groupId:artifactId:version.
Aunque también la podemos registrar haciendo uso de la interfaz, para eso lo primero dentro del servidor es pulsar sobre ADD APPLICATION(S).
Y veremos registrada nuestra aplicación batch-processing
Crear y ejecutar una Task
Con nuestra aplicación registrada es momento de crear nuestra task, la cual lo podemos hacer de dos maneras:
- Por consola: Es necesario tener instalada la shell.
- Con la interfaz: A través del navegador.
Ejecutar task por Consola
Para poder realizar las ejecuciones por consola, necesitamos tener instalado o levantado la shell de Spring Cloud Data Flow.
Al hacerlo por línea de comando debermos ejecutar el siguiente comando:
task create batch-processing --definition batch-processing
Una vez se ha creado la task es momento de ejecutarla:
task launch batch-processing
Para ver el listado de todas las tareas podemos hacer:
task list
Y una vez lanzada podemos ver el estado de la ejecución:
task execution list
Ejecutar Batch por la Interfaz de SCDF
Para crear una nueva task será suficiente con pulsar en la parte superior sobre create a task
Ejecución Lanzada
Ejecución completada
Analizando Logs
En cualquier momento podemos analizar los logs de lo que esta sucediendo.
Conclusión
En este artículo hemos visto una introducción mediante un ejemplo al procesamiento Batch con Spring Cloud Data Flow, el cual nos ayudará a crear nuestros procesos y planificarlos a través de su interfaz o de sus comando.
Si necesitas más información puedes escribirnos un comentario o un correo electrónico a refactorizando.web@gmail.com o también nos puedes contactar por nuestras redes sociales Facebook o twitter y te ayudaremos encantados!