Aquí tenemos otro vídeo dedicado al desarrollo de sistemas, concretamente hoy presentamos una manera de implementar el patrón “Message Queue”(Cola de mensajes) muy usado en el desarrollo de microservicios. El uso de este patrón nos permite crear aplicaciones mas escalables y con niveles de acoplamiento mas bajo. Aquí tenéis el vídeo:
Empezamos el vídeo arrancando la base de datos Redis como contenedor Docker:
sudo docker run --name redis -d redis:5.0.4
Configuración Gradle
La configuración del fichero Gradle queda de la siguiente manera para generar un Jar autoejecutable que contenga todas sus dependencias dentro:
plugins { id 'java' } dependencies { compile group: 'redis.clients', name: 'jedis', version: '3.0.1' } repositories { jcenter() } jar { manifest { attributes 'Main-Class': 'com.lostsys.redis.Main' } from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } }
Con esto si queremos generar el Jar solo tendremos que ejecutar(Desde la carpeta del proyecto, donde además tenemos el ejecutable gradlew):
./gradlew jar
Código de la aplicación
La aplicación cabe toda en un solo fichero:
package com.lostsys.redis; import java.util.List; import java.util.UUID; import redis.clients.jedis.Jedis; public class Main { private static String REDIS_HOST="172.17.0.4"; private static String REDIS_LIST="listayoutube"; public static void main(String[] args) { if ( args.length!=1 ) { printUsage(); return; } if ( args[0].equals("producer") ) producer(); else if ( args[0].equals("consumer") ) consumer(); else printUsage(); } public static void producer() { Jedis jedis = new Jedis( REDIS_HOST ); while (true) { String newElement=UUID.randomUUID().toString(); jedis.rpush( REDIS_LIST, newElement ); /* limpiamos pantalla */ System.out.print("\033[H\033[2J"); System.out.flush(); System.out.println("REDIS Productor"); System.out.println("==============="); System.out.println(""); System.out.println("Total de elementos: "+jedis.llen( REDIS_LIST )); System.out.println("Elemento: "+jedis.lrange( REDIS_LIST , 0, -1)); try { Thread.sleep(1000); } catch (Exception ex) { ex.printStackTrace(); } } } public static void consumer() { Jedis jedis = new Jedis( REDIS_HOST ); /* limpiamos pantalla */ System.out.print("\033[H\033[2J"); System.out.flush(); System.out.println("REDIS Consumidor"); System.out.println("================"); while (true) { List<String> element=jedis.blpop( 0, REDIS_LIST ); System.out.print("Elemento leído: "+element); System.out.println(" ("+jedis.llen( REDIS_LIST )+" Pendientes)"); try { Thread.sleep(1500); } catch (Exception ex) { ex.printStackTrace(); } } } public static void printUsage() { System.out.println(""); System.out.println("USAGE: java -jar Redis.jar <producer|consumer>"); System.out.println(""); } }
Una vez compilada la aplicación podremos ejecutarla de la siguiente manera:
# Para arrancar la aplicación como productor java -jar build/libs/Redis.jar producer #Para arrancar la aplicación como consumidor java -jar build/libs/Redis.jar consumer
Espero no dejarme nada, si queréis mas posts y vídeos como este ya sabéis!!! Compartir, like, suscribirse y comentar 😀