Chế độ hàng đợi đơn giản nhất trong Java RabbitMQ bao gồm một nhà sản xuất và một người tiêu dùng.

RabbitMQ Simple Queue

Hiện nay, các hoạt động Java với RabbitMQ chủ yếu sử dụng gói spring-boot-starter-amqp của Spring Boot, bản chất là sử dụng Spring AMQP để vận hành hàng đợi.

1. Hướng dẫn tiên quyết

Vui lòng đọc các chương sau để hiểu kiến thức liên quan:

2. Gói Phụ Thuộc

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

3. Cấu hình RabbitMQ

Sửa đổi cấu hình application.yml:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

4. Khai Báo Hàng Đợi

Cấu hình hàng đợi thông qua lớp cấu hình Spring Boot:

package com.tizi365.rabbitmq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConfig {
    @Bean
    public Queue helloQueue() {
        // Khai báo hàng đợi, và tên hàng đợi cần phải là duy nhất
        return new Queue("hello");
    }
}

Mẹo: Bạn có thể xác định nhiều hàng đợi theo nhu cầu kinh doanh. Tên hàng đợi và id bean của hàng đợi chỉ cần khác nhau. Ở đây, tên phương thức là id bean.

5. Gửi Tin Nhắn

Gửi tin nhắn đòi hỏi lớp RabbitTemplate, mà Spring Boot đã khởi tạo cho chúng ta. Chỉ cần tiêm (inject) thể hiện:

package com.tizi365.rabbitmq.service;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class SendService {
    // Tiêm (inject) thể hiện RabbitTemplate
    @Autowired
    private RabbitTemplate template;
    
    // Tiêm (inject) hàng đợi đã được xác định trước
    @Autowired
    @Qualifier("helloQueue")
    private Queue helloQueue;
    
    // Để minh họa, chúng ta sử dụng nhiệm vụ được lập lịch tích hợp sẵn của Spring để gửi tin nhắn đều đặn (một tin nhắn mỗi giây)
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // Nội dung tin nhắn
        String message = "Hello World!";
        // Gửi tin nhắn
        // Tham số đầu tiên là khóa định tuyến, ở đây chúng ta sử dụng tên hàng đợi làm khóa định tuyến
        // Tham số thứ hai là nội dung tin nhắn, hỗ trợ bất kỳ loại nào miễn là nó hỗ trợ tuần tự hóa
        template.convertAndSend(helloQueue.getName(), message);
        System.out.println("Đang gửi tin nhắn '" + message + "'");
    }
}

Mẹo: Ở đây, chúng ta không trực tiếp sử dụng trao đổi. Trong trao đổi mặc định gốc (trao đổi trực tiếp) sẽ được sử dụng.

6. Nhận Tin Nhắn

Cũng đơn giản cho người tiêu dùng nhận tin nhắn:

package com.tizi365.rabbitmq.listener;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
// Khai báo trình nghe tin nhắn, chỉ định hàng đợi để lắng nghe thông qua tham số `queues`, cần phải nhất quán với tên hàng đợi trước đó
@RabbitListener(queues = "hello")
public class HelloListener {
	// Sử dụng RabbitHandler để đánh dấu trình xử lý tin nhắn, được sử dụng để thực hiện logic xử lý tin nhắn
    @RabbitHandler
    public void receive(String msg) {
        System.out.println("Người tiêu dùng - Nhận tin nhắn '" + msg + "'");
    }
}

7. Loại Tin Nhắn Tùy Chỉnh

Trước đó, chúng ta gửi một tin nhắn kiểu chuỗi. Trong các kịch bản kinh doanh thực tế, chúng ta sẽ thích gửi trực tiếp các loại dữ liệu đối tượng Java tùy chỉnh khác nhau.

Xác định đối tượng thực thể

package com.tizi365.rabbitmq.domain;

import java.io.Serializable;
import lombok.Data;

// Nội dung blog
@Data
public class Blog implements Serializable {
    // id
    private Integer id;
    // tiêu đề
    private String title;
}

Gửi tin nhắn kiểu tùy chỉnh

Blog blog = new Blog();
blog.setId(100);
blog.setTitle("Hướng dẫn RabbitMQ Tizi365");

// Gửi tin nhắn
template.convertAndSend(helloQueue.getName(), blog);

Nhận các loại tin nhắn tùy chỉnh

@RabbitHandler
// Đơn giản chỉ cần thay đổi tham số của phương thức thành loại tin nhắn tùy chỉnh
public void receive(Blog msg) {
    System.out.println("Người tiêu thụ - Nhận tin nhắn '" + msg.getTitle() + "'");
}

Sử dụng JSON serialization cho nội dung tin nhắn

Khi RabbitMQ gửi dữ liệu đối tượng Java, mặc định sử dụng công cụ serialization đối tượng của JDK. Chúng ta có thể thay đổi nó để sử dụng định dạng JSON cho serialization dữ liệu, điều này cho phép các ngôn ngữ khác tiêu thụ các tin nhắn được gửi từ Java và làm cho định dạng tin nhắn dễ đọc hơn.

Chỉnh sửa lớp cấu hình trước đó và thêm cấu hình sau đây để sử dụng trình phân tích cú pháp JSON của Jackson cho việc serialization và deserialization dữ liệu tin nhắn.

@Bean
public Jackson2JsonMessageConverter messageConverter() {
    // Thiết lập bộ chuyển đổi tin nhắn mặc định
    return new Jackson2JsonMessageConverter();
}