Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Building a RabbitMQ Application with Spring Boot

Tech May 11 4

Maven Dependencies

<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 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>rabbitmq-demo</artifactId>
    <version>1.0.0</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Application Configuration

server:
  port: 8080
spring:
  application:
    name: rabbitmq-service
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

Application Entry Point

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RabbitMQApplication {
    public static void main(String[] args) {
        SpringApplication.run(RabbitMQApplication.class, args);
    }
}

Message Consumer Implemantation

package com.example.service;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Service
public class MessageReceiver {

    @RabbitListener(queues = "worker_queue")
    public void processWorker1(String message) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Worker 1 processing: " + message);
    }

    @RabbitListener(queues = "worker_queue")
    public void processWorker2(String message) {
        System.out.println("Worker 2 processing: " + message);
    }

    @RabbitListener(queues = "broadcast_queue_a")
    public void handleBroadcastA(String message) {
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Broadcast Receiver A: " + message);
    }

    @RabbitListener(queues = "broadcast_queue_b")
    public void handleBroadcastB(String message) {
        System.out.println("Broadcast Receiver B: " + message);
    }

    @RabbitListener(queues = "direct_queue_x")
    public void processDirectX(String message) {
        System.out.println("Direct Queue X: " + message);
    }

    @RabbitListener(queues = "direct_queue_y")
    public void processDirectY(String message) {
        System.out.println("Direct Queue Y: " + message);
    }

    @RabbitListener(queues = "pattern_queue_a")
    public void handlePatternA(String message) {
        System.out.println("Pattern Queue A: " + message);
    }

    @RabbitListener(queues = "pattern_queue_b")
    public void handlePatternB(String message) {
        System.out.println("Pattern Queue B: " + message);
    }

    @RabbitListener(queues = "scheduled_queue")
    public void processScheduledMessage(String message) {
        String timestamp = LocalDateTime.now()
            .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        System.out.println("Received at: " + timestamp);
        System.out.println("Scheduled message: " + message);
    }
}

Messsage Producer Implementation

package com.example.controller;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@RestController
public class MessageController {

    @Autowired
    private AmqpTemplate messagingTemplate;

    @GetMapping("/worker")
    public String sendWorkerMessages() {
        for (int i = 0; i < 10; i++) {
            messagingTemplate.convertAndSend("worker_queue", "Task " + i);
        }
        return "Worker messages sent";
    }

    @GetMapping("/broadcast")
    public String broadcastMessages() {
        for (int i = 0; i < 10; i++) {
            messagingTemplate.convertAndSend("broadcast_exchange", "", 
                "Broadcast message " + i);
        }
        return "Broadcast messages sent";
    }

    @GetMapping("/direct/x")
    public String sendDirectX() {
        messagingTemplate.convertAndSend("direct_exchange", "route_x", 
            "Direct message for X");
        return "Direct X message sent";
    }

    @GetMapping("/direct/y")
    public String sendDirectY() {
        messagingTemplate.convertAndSend("direct_exchange", "route_y", 
            "Direct message for Y");
        return "Direct Y message sent";
    }

    @GetMapping("/pattern/a")
    public String sendPatternA() {
        messagingTemplate.convertAndSend("pattern_exchange", "key.a", 
            "Pattern message A");
        return "Pattern A message sent";
    }

    @GetMapping("/pattern/b")
    public String sendPatternB() {
        messagingTemplate.convertAndSend("pattern_exchange", "pattern.key", 
            "Pattern message B");
        return "Pattern B message sent";
    }

    @GetMapping("/scheduled")
    public String sendDelayedMessage() {
        messagingTemplate.convertAndSend("scheduled_exchange", "scheduled_key", 
            "Delayed message content", new MessagePostProcessor() {
                @Override
                public Message postProcessMessage(Message message) {
                    String sendTime = LocalDateTime.now()
                        .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                    System.out.println("Sent at: " + sendTime);
                    message.getMessageProperties().setDelay(5000);
                    return message;
                }
            });
        return "Scheduled message sent";
    }
}

RabbitMQ Management Components

  • Queue Configuraton
  • Exchange Setup
  • Routing Key Binding
  • User Management
  • Virtual Host Configuration

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.