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
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.