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

Deja un comentario

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

Facebook
Twitter
LinkedIn

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies

Ver mi IP

Ver ip de mi máquina
tipo valor
Ip: 100.28.227.63
Proxy: 100.28.227.63
Remote host: ec2-100-28-227-63.compute-1.amazonaws.com
Remote port: 54130
** 100.28.227.63, 172.70.38.24