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.
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();
}