Enjoy A New Student Discount All 55,000 Courses on sale for Only $12.99

Ends in 05h 23m 49s

Java17 – Probando el trabajo con RabbitMQ-3

El «Consumer»

Teniendo el servidor en marcha y configurado como hemos indicado en el articulo anterior, vamos a crear una pequeña aplicación. Según nuestro planteamiento, esta aplicación debe esperar mensajes con un nombre de cliente y una dirección de correo y lo debe archivar en una base de datos. Naturalmente, para simplificar la explicación, y sobre todo para centrarnos en nuestro problema, la aplicación se limitara a recoger esos mensajes, y mandarlos a la consola, el resto del trabajo, estáis perfectamente capacitados para llevarlos a cabo.

Tambien quiero destacar otra ventaja que nos ofrece trabajar con RabbitMq, y es que el se ha de encargar de hacernos llegar los mensajes, e incluso de recuperarlos si hay una caída de maquina, desacoplándonos TOTALMENTE del emisor del mensaje.

La aplicación

Vamos a crear una aplicación con Java17 y Spring, utilizando también Spring AMQP, llamada AMQP-ConsumerCrud

  • Utilizaremos Maven
  • Java 17

En eclipse, quedaría así

Los módulos a incluir en el package serán

  • Spring for RabbitMQ
  • Spring Boot DevTools

Añadiendo que solo el primero seria necesario. Insisto en que solo estamos teniendo en cuenta la recepción de los mensajes

Como vamos a utilizar JSON para recibir la clase, necesitaremos incorporar una clase mas, y directamente en el pom.xml podemos añadir

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>

Debemos configurar la conexión al servidor, para lo cual, en src/main/resources abrimos el fichero application.properties

spring.rabbitmq.host=http://localhost
spring.rabbitmq.port=5679		
spring.rabbitmq.username=blogCrud
spring.rabbitmq.password=<pass usuario>
spring.rabbitmq.virtual-host=HostCrud

rabbitmq.queue.name=paraEmail

Únicamente se tratan de los datos de conexión que hemos definido anteriormente, y, de paso, aprovechamos el fichero para guardar una constante mas, que luego utilizaremos(rabbitmq.queue.name)

Debido también a que vamos a trabajar con JSON, deberemos configurar un poco el template de Rabbit, para proporcionarle un decoder de JSON, eso lo hacemos creando un modulo de configuración

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

	@Bean
	public MessageConverter converter() {
		return new Jackson2JsonMessageConverter();
	}

	@Bean
	public AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory) {
		RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
		rabbitTemplate.setMessageConverter(converter());
		return rabbitTemplate;
	}

}

Ahora, solo nos queda configurar el objeto DTO que vamos a recibir, y que sabemos que es

public class ClienteMail {
    private int id;
    private String nombreCliente;
    private String correoElectronico;
	
    public ClienteMail() {
		super();		
	}

	public ClienteMail(int id, String nombreCliente, String correoElectronico) {
		super();
		this.id = id;
		this.nombreCliente = nombreCliente;
		this.correoElectronico = correoElectronico;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getNombreCliente() {
		return nombreCliente;
	}

	public void setNombreCliente(String nombreCliente) {
		this.nombreCliente = nombreCliente;
	}

	public String getCorreoElectronico() {
		return correoElectronico;
	}

	public void setCorreoElectronico(String correoElectronico) {
		this.correoElectronico = correoElectronico;
	}

	@Override
	public String toString() {
		return "ClienteMail [id=" + id + ", nombreCliente=" + nombreCliente + ", correoElectronico=" + correoElectronico
				+ "]";
	}

Que como veis, se trata de un simple POJO

Y por ultimo, escribimos el Consumer, en el que solo debemos hacer referencia a la cola a la que se ha de suscribir

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import com.rf.rabbit.dto.ClienteMail;

@Service
public class RabbitMqJsonConsumer {

	private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMqJsonConsumer.class);

	@RabbitListener(queues = { "${rabbitmq.queue.name}" })
	public void consumeJsonMessage(ClienteMail cliente) {
		LOGGER.info(String.format("Recibiendo mensaje JSON -> %s", cliente.toString()));
	}

}

Como veis, solo indicamos el nombre de la cola, que lo estamos sacando del application.properties, y automaticamente enviamos el objeto recibido al LOG del servidor, y su consola

En este punto, esta aplicación ya se puede ejecutar….aunque se quedara esperando el recibir algún mensaje, sin embargo, y una vez comprobado que funciona, seria interesante que la lanzáramos desde una pantalla CMD situada en la raíz del proyecto y con la orden

mvn spring-boot:run

Ahora, ya tenemos que ir a escribir el Producer, para ver completo el ejercicio


Descubre más desde Recursos para formacion

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Deja un comentario

/*Si te ha gustado el artículo
no dudes en compartirlo*/

Facebook
Twitter
LinkedIn

Ver mi IP

Añade aquí tu texto de cabecera