🎓 Top 15 Udemy Courses (80-90% Discount): My Udemy Courses - Ramesh Fadatare — All my Udemy courses are real-time and project oriented courses.
▶️ Subscribe to My YouTube Channel (178K+ subscribers): Java Guides on YouTube
▶️ For AI, ChatGPT, Web, Tech, and Generative AI, subscribe to another channel: Ramesh Fadatare on YouTube
In this tutorial, you will learn how to create multiple Queues in Spring Boot RabbitMQ application. You will also learn how to send and receive messages to/from the Producer and the Consumer in the Spring boot application using RabbitMQ.
Note that we are going to use Spring boot 3 and JDK 17 or later versions for this tutorial.
RabbitMQ is a message queue software (message broker/queue manager) that acts as an intermediary platform where different applications can send and receive messages.
We will use the Spring AMQP module to work with RabbitMQ in the Spring boot application as AMQP messaging solutions.
Spring Boot RabbitMQ Architecture with Multiple Queues
The Producer is an application that sends messages to the RabbitMQ broker and the Consumer is an application that reads messages from the RabbitMQ broker.
In this tutorial, we will implement below Spring Boot RabbitMQ architecture flow:
We will create two Queues:Prerequisites
1. Create and Setup Spring Boot Project in IntelliJ
2. Maven Dependencies
Here is the complete pom.xml file for your reference:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">	<modelVersion>4.0.0</modelVersion>	<parent>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-parent</artifactId>	<version>3.0.0-SNAPSHOT</version>	<relativePath/> <!-- lookup parent from repository -->	</parent>	<groupId>net.javaguides</groupId>	<artifactId>springboot-rabbitmq-tutorial</artifactId>	<version>0.0.1-SNAPSHOT</version>	<name>springboot-rabbitmq-tutorial</name>	<description>Demo project for Spring Boot and RabbitMQ</description>	<properties>	<java.version>17</java.version>	</properties>	<dependencies>	<dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-amqp</artifactId>	</dependency>	<dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-web</artifactId>	</dependency>	<dependency>	<groupId>org.projectlombok</groupId>	<artifactId>lombok</artifactId>	<optional>true</optional>	</dependency>	<dependency>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-starter-test</artifactId>	<scope>test</scope>	</dependency>	<dependency>	<groupId>org.springframework.amqp</groupId>	<artifactId>spring-rabbit-test</artifactId>	<scope>test</scope>	</dependency>	</dependencies>	<build>	<plugins>	<plugin>	<groupId>org.springframework.boot</groupId>	<artifactId>spring-boot-maven-plugin</artifactId>	<configuration>	<excludes>	<exclude>	<groupId>org.projectlombok</groupId>	<artifactId>lombok</artifactId>	</exclude>	</excludes>	</configuration>	</plugin>	</plugins>	</build>	<repositories>	<repository>	<id>spring-milestones</id>	<name>Spring Milestones</name>	<url>https://repo.spring.io/milestone</url>	<snapshots>	<enabled>false</enabled>	</snapshots>	</repository>	<repository>	<id>spring-snapshots</id>	<name>Spring Snapshots</name>	<url>https://repo.spring.io/snapshot</url>	<releases>	<enabled>false</enabled>	</releases>	</repository>	</repositories>	<pluginRepositories>	<pluginRepository>	<id>spring-milestones</id>	<name>Spring Milestones</name>	<url>https://repo.spring.io/milestone</url>	<snapshots>	<enabled>false</enabled>	</snapshots>	</pluginRepository>	<pluginRepository>	<id>spring-snapshots</id>	<name>Spring Snapshots</name>	<url>https://repo.spring.io/snapshot</url>	<releases>	<enabled>false</enabled>	</releases>	</pluginRepository>	</pluginRepositories> </project>3. Project Structure
4. Connect Spring Boot Application with RabbitMQ
spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest5. Configure RabbitMQ in Spring Boot Application
package net.javaguides.springboot.config; 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.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class RabbitMQConfig { @Value("${rabbitmq.queue.name}") private String queue; @Value("${rabbitmq.queue.json.name}") private String jsonQueue; @Value("${rabbitmq.exchange.name}") private String exchange; @Value("${rabbitmq.routing.key}") private String routingKey; @Value("${rabbitmq.routing.json.key}") private String routingJsonKey; // spring bean for rabbitmq queue @Bean public Queue queue(){ return new Queue(queue); } // spring bean for queue (store json messages) @Bean public Queue jsonQueue(){ return new Queue(jsonQueue); } // spring bean for rabbitmq exchange @Bean public TopicExchange exchange(){ return new TopicExchange(exchange); } // binding between queue and exchange using routing key @Bean public Binding binding(){ return BindingBuilder .bind(queue()) .to(exchange()) .with(routingKey); } // binding between json queue and exchange using routing key @Bean public Binding jsonBinding(){ return BindingBuilder .bind(jsonQueue()) .to(exchange()) .with(routingJsonKey); } @Bean public MessageConverter converter(){ return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(converter()); return rabbitTemplate; } // ConnectionFactory // RabbitTemplate // RabbitAdmin } // spring bean for rabbitmq queue @Bean public Queue queue(){ return new Queue(queue); } // spring bean for queue (store json messages) @Bean public Queue jsonQueue(){ return new Queue(jsonQueue); } // spring bean for rabbitmq exchange @Bean public TopicExchange exchange(){ return new TopicExchange(exchange); } // binding between queue and exchange using routing key @Bean public Binding binding(){ return BindingBuilder .bind(queue()) .to(exchange()) .with(routingKey); } // binding between json queue and exchange using routing key @Bean public Binding jsonBinding(){ return BindingBuilder .bind(jsonQueue()) .to(exchange()) .with(routingJsonKey); } @Bean public MessageConverter converter(){ return new Jackson2JsonMessageConverter(); } @Bean public AmqpTemplate amqpTemplate(ConnectionFactory connectionFactory){ RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory); rabbitTemplate.setMessageConverter(converter()); return rabbitTemplate; }The application.properties file change
rabbitmq.queue.name=javaguides rabbitmq.exchange.name=javaguides_exchange rabbitmq.routing.key=javaguides_routing_key rabbitmq.queue.json.name=javaguides_json rabbitmq.routing.json.key=javaguides_routing_json_key6. Create RabbitMQ Producers
RabbitMQProducer - Send String Message
package net.javaguides.springboot.publisher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class RabbitMQProducer { @Value("${rabbitmq.exchange.name}") private String exchange; @Value("${rabbitmq.routing.key}") private String routingKey; private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQProducer.class); private RabbitTemplate rabbitTemplate; public RabbitMQProducer(RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; } public void sendMessage(String message){ LOGGER.info(String.format("Message sent -> %s", message)); rabbitTemplate.convertAndSend(exchange, routingKey, message); } }RabbitMQJsonProducer - Send JSON Message
package net.javaguides.springboot.dto; import lombok.Data; @Data public class User { private int id; private String firstName; private String lastName; }package net.javaguides.springboot.publisher; import net.javaguides.springboot.dto.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class RabbitMQJsonProducer { @Value("${rabbitmq.exchange.name}") private String exchange; @Value("${rabbitmq.routing.json.key}") private String routingJsonKey; private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQJsonProducer.class); private RabbitTemplate rabbitTemplate; public RabbitMQJsonProducer(RabbitTemplate rabbitTemplate) { this.rabbitTemplate = rabbitTemplate; } public void sendJsonMessage(User user){ LOGGER.info(String.format("Json message sent -> %s", user.toString())); rabbitTemplate.convertAndSend(exchange, routingJsonKey, user); } }7. Create REST API to Send String and JSON Messages
MessageController
package net.javaguides.springboot.controller; import net.javaguides.springboot.publisher.RabbitMQProducer; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1") public class MessageController { private RabbitMQProducer producer; public MessageController(RabbitMQProducer producer) { this.producer = producer; } // http://localhost:8080/api/v1/publish?message=hello @GetMapping("/publish") public ResponseEntity<String> sendMessage(@RequestParam("message") String message){ producer.sendMessage(message); return ResponseEntity.ok("Message sent to RabbitMQ ..."); } }MessageJsonController
package net.javaguides.springboot.controller; import net.javaguides.springboot.dto.User; import net.javaguides.springboot.publisher.RabbitMQJsonProducer; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/v1") public class MessageJsonController { private RabbitMQJsonProducer jsonProducer; public MessageJsonController(RabbitMQJsonProducer jsonProducer) { this.jsonProducer = jsonProducer; } @PostMapping("/publish") public ResponseEntity<String> sendJsonMessage(@RequestBody User user){ jsonProducer.sendJsonMessage(user); return ResponseEntity.ok("Json message sent to RabbitMQ ..."); } }8. Create RabbitMQ Consumers
RabbitMQ Consumer - Consume String Message
package net.javaguides.springboot.consumer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; @Service public class RabbitMQConsumer { private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQConsumer.class); @RabbitListener(queues = {"${rabbitmq.queue.name}"}) public void consume(String message){ LOGGER.info(String.format("Received message -> %s", message)); } }RabbitMQ Consumer - Consume JSON Message
Let's create RabbitMQJsonConsumer class and add the following content to it:
package net.javaguides.springboot.consumer; import net.javaguides.springboot.dto.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Service; @Service public class RabbitMQJsonConsumer { private static final Logger LOGGER = LoggerFactory.getLogger(RabbitMQJsonConsumer.class); @RabbitListener(queues = {"${rabbitmq.queue.json.name}"}) public void consumeJsonMessage(User user){ LOGGER.info(String.format("Received JSON message -> %s", user.toString())); } }We configure consumers using the @RabbitListener annotation. The only argument passed here is the queues' name. Consumers are not aware here of exchanges or routing keys.
The @RabbitListener will trigger a logic inside Spring to find a converter from JSON to that specific class.
9. Demo
Now let's make a POST REST API call to send a JSON message to RabbitMQ:
Check Console Logs
Udemy Course
Conclusion
In this tutorial, you learned how to create multiple Queues in Spring Boot RabbitMQ application. You also learned how to send and receive messages to/from the Producer and the Consumer in the Spring boot application using RabbitMQ.
 
  
  
 ![[NEW] Full-Stack Java Development with Spring Boot 3 & React Build 5 Spring Boot Projects with Java: Line-by-Line Coding](https://img-c.udemycdn.com/course/750x422/5338984_4d3a_5.jpg) 
  
  
  
  
  
  
  
  
  
  
 





Comments
Post a Comment
Leave Comment