Mode antrian terdapat dalam RabbitMQ Java terdiri dari produsen dan konsumen.

RabbitMQ Simple Queue

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