Building Scalable Applications: Harnessing RabbitMQ with Spring Boot in Java Part - 1

1. Overview:

In this concise tutorial, we'll explore the seamless integration of RabbitMQ with SpringBoot in Java. This approach is suitable for scenarios where immediate user response is required, such as during user onboarding in an application. The success response is provided immediately, and subsequent processes, like sending an onboarding email, can occur after the response is sent to the user.

 

Simple RabbitMQ with SpringBoot Java

2. Understanding RabbitMQ Messaging

  • What is messaging queue?

Message queuing is a communication method used in distributed systems where messages are sent asynchronously between applications. Messages are stored temporarily in queues until they are retrieved and processed by the receiving applications. This decouples the sender and receiver, enabling asynchronous and reliable communication, and is commonly used for inter-process communication, microservices, and event-driven architectures.

  • Key concepts of RabbitMQ

RabbitMQ is a message broker that facilitates communication between different components of a distributed system. Key concepts include:

Exchanges: Entry point for messages into RabbitMQ. They route messages to queues based on routing rules. 

Queues: Temporary storage for messages. Messages are stored until consumed by a subscriber.

Bindings: Rules that define how messages are routed from exchanges to queues.

Routing: Determines how messages are directed from exchanges to queues based on routing keys.

Publishers: Applications that send messages to exchanges.

Consumers: Applications that receive and process messages from queues.

These concepts form the basis of RabbitMQ's functionality, enabling efficient and reliable message delivery in distributed systems. 

3. Setting up RabbitMQ and integrating with SpringBoot

  • Installation and setup of RabbitMQ server

Pull the Docker image for RabbitMQ management and execute it to access the RabbitMQ management dashboard with this command:

docker pull rabbitmq:3.13.0-management

To run the RabbitMQ management image, use the following command:

docker run -d --name rabbitmq-management -p 15672:15672 -p 5672:5672 rabbitmq:3.13.0-management

The management webpage is accessible on port 15672, while data communication with RabbitMQ is exposed on port 5672. 

You can access the management website at the following URL: http://localhost:15672/. To log in, use the default credentials: username "guest" and password "guest". Please note that the "guest" user credentials are only valid in a development environment. After a successfull login you will be taken to the following screen.

Great! Now that we have a basic Spring Boot Maven project set up, we are ready to integrate RabbitMQ with our project. Let's dive into the steps to integrate RabbitMQ into our Spring Boot application. 

  • Integrating RabbitMQ with SpringBoot application

Let's add the following dependancy in pom.xml for using rabbitMQ in our application.

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-amqp</artifactId>

<version>3.1.5</version>

</dependency> 

Under application.properties add the connection string of the rabbitMQ.

spring.rabbitmq.addresses= amqp://guest:guest@localhost:5672/

Let's configure the exchange, routing key and queue for our project.

spring.rabbitmq.exchange = notification
spring.rabbitmq.routingKey = emailRouting
spring.rabbitmq.emailQueue = email

Create a Java class named RabbitMQConfig.java and annotate it with @Configuration. This class will be responsible for reading the properties for exchange, routing, and queue from the application.properties file. Additionally, it will create the corresponding channels with RabbitMQ.

@Value("${spring.rabbitmq.exchange.name}")

private String exchange

@Value("${spring.rabbitmq.routing.emailKey}")

private String routingKey;

@Value("${spring.rabbitmq.queue.email}")

private String queue; 

We will create beans for the exchange, queue, and bind them with a routing key using the @Bean annotation.

 


@Bean
public TopicExchange exchange() {
return new TopicExchange(exchange);
}

@Bean
public Queue emailQueue() {
return new Queue(mailQueue);
}

@Bean
public Binding emailBinding() {
return BindingBuilder.bind(emailQueue()).to(exchange()).with(mailRoutingKey); 
    }

 

We use Jackson2JsonMessageConverter to convert the json object to string and vice versa.

 

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

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

Now it's time to define the producer, which will be responsible for sending our data to the queue.

@Service
public class RabbitMQProducer {
@Value("${spring.rabbitmq.exchange.name}")
private String exchange;
@Value("${spring.rabbitmq.routing.emailKey}")
private String routingKey;
private RabbitTemplate rabbitTemplate;

public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
this.rabbitTemplate = rabbitTemplate;
}

public void sendMessage(EmailReq emailReq) {

rabbitTemplate.convertAndSend(exchange, routingKey, emailReq);

} 
} 

 you can pass the data to this producer and the data will be sent to queue and stored in it.

 


To retrieve data from the queue, we require a consumer that is responsible for fetching the data.

@Service
public class RabbitMQConsumer {

@RabbitListener(queues = { "${spring.rabbitmq.queue.email}" })
public void consumeEmail(EmailReq message) {
System.out.println(message);
}
}

 

4. Summary

Well done! You've successfully created a basic message queuing application using SpringBoot and RabbitMQ. There's a lot more you can do with SpringBoot and RabbitMQ beyond what we've covered here, but this guide should give you a solid foundation to build upon. 

In the next section, we'll explore prioritizing messages in the queue and handling errors for messages in the queue.

 

 

 

 

 

Comments