Mode antrian terdapat dalam RabbitMQ Java terdiri dari produsen dan konsumen.
Saat ini, operasi Java dengan RabbitMQ umumnya menggunakan paket spring-boot-starter-amqp
dari Spring Boot, yang pada dasarnya menggunakan Spring AMQP untuk mengoperasikan antrian.
1. Tutorial Prasyarat
Silakan baca bab berikut untuk memahami pengetahuan terkait:
2. Paket Ketergantungan
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3. Konfigurasi RabbitMQ
Ubah konfigurasi application.yml
:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
4. Mendeklarasikan Antrian
Konfigurasi antrian melalui kelas konfigurasi 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() {
// Mendeklarasikan antrian, dan nama antrian harus unik
return new Queue("hello");
}
}
Tip: Anda dapat mendefinisikan multiple antrian sesuai dengan kebutuhan bisnis. Nama antrian dan id bean dari Antrian harus berbeda. Di sini, nama metode adalah id bean.
5. Mengirim Pesan
Mengirim pesan memerlukan kelas RabbitTemplate, yang telah diinisialisasi oleh Spring Boot. Cukup menyuntikkan instansinya:
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 {
// Menyuntikkan instansi RabbitTemplate
@Autowired
private RabbitTemplate template;
// Menyuntikkan antrian yang sebelumnya didefinisikan
@Autowired
@Qualifier("helloQueue")
private Queue helloQueue;
// Untuk demonstrasi, kita menggunakan tugas terjadwal bawaan dari Spring untuk mengirim pesan secara teratur (satu pesan per detik)
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void send() {
// Konten pesan
String message = "Hello World!";
// Mengirim pesan
// Parameter pertama adalah kunci routing, di sini kita menggunakan nama antrian sebagai kunci routing
// Parameter kedua adalah konten pesan, mendukung tipe apa pun selama mendukung serialisasi
template.convertAndSend(helloQueue.getName(), message);
System.out.println("Mengirim pesan '" + message + "'");
}
}
Tip: Di sini, kita tidak langsung menggunakan pertukaran. Pertukaran default yang mendasarinya (Pertukaran Langsung) akan digunakan.
6. Menerima Pesan
Sangat sederhana bagi konsumen untuk menerima pesan:
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
// Mendeklarasikan pendengar pesan, tentukan antrian yang akan didengarkan melalui parameter `queues`, yang perlu konsisten dengan nama antrian sebelumnya
@RabbitListener(queues = "hello")
public class HelloListener {
// Menggunakan RabbitHandler untuk menandai penangan pesan, digunakan untuk mengeksekusi logika pemrosesan pesan
@RabbitHandler
public void receive(String msg) {
System.out.println("Konsumen - Menerima pesan '" + msg + "'");
}
}
7. Tipe Pesan Kustom
Sebelumnya, kami mengirimkan pesan tipe string. Dalam skenario bisnis yang sebenarnya, kami akan lebih memilih untuk langsung mengirim berbagai tipe objek Java kustom.
Mendefinisikan objek entitas
package com.tizi365.rabbitmq.domain;
import java.io.Serializable;
import lombok.Data;
// Konten blog
@Data
public class Blog implements Serializable {
// id
private Integer id;
// judul
private String title;
}
Mengirim pesan tipe kustom
Blog blog = new Blog();
blog.setId(100);
blog.setTitle("Tutorial RabbitMQ Tizi365");
// Mengirim pesan
template.convertAndSend(helloQueue.getName(), blog);
Menerima pesan tipe kustom
@RabbitHandler
// Cukup ubah parameter metode ke tipe pesan kustom
public void receive(Blog msg) {
System.out.println("Konsumer - Menerima pesan '" + msg.getTitle() + "'");
}
Menggunakan serialisasi JSON untuk konten pesan
Ketika RabbitMQ mengirimkan data objek entitas Java, secara default akan menggunakan alat serialisasi objek JDK. Kita dapat mengubahnya untuk menggunakan format JSON untuk serialisasi data, yang memungkinkan bahasa lain untuk mengonsumsi pesan yang dikirimkan oleh Java dan membuat format pesan lebih mudah dibaca.
Modifikasi kelas konfigurasi sebelumnya dan tambahkan konfigurasi berikut untuk menggunakan parser JSON Jackson untuk serialisasi dan deserialisasi data pesan.
@Bean
public Jackson2JsonMessageConverter messageConverter() {
// Atur konverter pesan default
return new Jackson2JsonMessageConverter();
}