Najprostszy tryb kolejki w Java RabbitMQ składa się z producenta i konsumenta.

RabbitMQ Prosta Kolejka

Obecnie operacje Java z RabbitMQ głównie wykorzystują pakiet spring-boot-starter-amqp w ramach Spring Boot, co w zasadzie oznacza korzystanie z Spring AMQP do obsługi kolejki.

1. Samouczek wstępny

Proszę przeczytać poniższe rozdziały, aby zrozumieć odpowiednią wiedzę:

2. Pakiet Zależności

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

3. Konfiguracja RabbitMQ

Zmodyfikuj konfigurację w pliku application.yml:

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

4. Deklaracja Kolejki

Skonfiguruj kolejkę za pomocą klasy konfiguracyjnej 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() {
        // Deklaruj kolejkę, a nazwa kolejki musi być unikalna
        return new Queue("hello");
    }
}

Wskazówka: Możesz zdefiniować wiele kolejek zgodnie z potrzebami biznesowymi. Nazwa kolejki i identyfikatoru bean Queue muszą być różne. Tutaj nazwa metody jest tożsama z identyfikatorem bean.

5. Wysyłanie Wiadomości

Do wysyłania wiadomości wymagana jest klasa RabbitTemplate, którą Spring Boot już zainicjalizował dla nas. Wystarczy wstrzyknąć instancję:

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 {
    // Wstrzyknij instancję RabbitTemplate
    @Autowired
    private RabbitTemplate template;
    
    // Wstrzyknij wcześniej zdefiniowaną kolejkę
    @Autowired
    @Qualifier("helloQueue")
    private Queue helloQueue;
    
    // Dla celów demonstracyjnych używamy wbudowanego zadania zaplanowanego Springa do regularnego wysyłania wiadomości (jedna wiadomość na sekundę)
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // Treść wiadomości
        String message = "Witaj Świecie!";
        // Wyślij wiadomość
        // Pierwszy parametr to klucz routingu, tutaj używamy nazwy kolejki jako klucza routingu
        // Drugi parametr to treść wiadomości, obsługuje dowolny typ, o ile obsługuje serializację
        template.convertAndSend(helloQueue.getName(), message);
        System.out.println("Wysyłanie wiadomości '" + message + "'");
    }
}

Wskazówka: Tutaj nie korzystamy bezpośrednio z wymiany. Zostanie wykorzystana domyślna wymiana podstawowa (Direct exchange).

6. Odbieranie Wiadomości

Dla konsumenta odbieranie wiadomości jest równie proste:

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
// Deklaruj słuchacza wiadomości, określ kolejkę do nasłuchiwania za pomocą parametru `queues`, który musi być zgodny z poprzednią nazwą kolejki
@RabbitListener(queues = "hello")
public class HelloListener {
	// Użyj RabbitHandler do oznaczenia obsługiwiadomości, które służy do wykonania logiki przetwarzania wiadomości
    @RabbitHandler
    public void receive(String msg) {
        System.out.println("Konsument - Odebrano wiadomość '" + msg + "'");
    }
}

7. Niestandardowy Typ Wiadomości

Poprzednio wysłaliśmy wiadomość typu ciąg. W rzeczywistych scenariuszach biznesowych wolałbyś bezpośrednio wysyłać różne niestandardowe typy obiektów Java.

Zdefiniuj obiekt encji

package com.tizi365.rabbitmq.domain;

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

// Zawartość bloga
@Data
public class Blog implements Serializable {
    // id
    private Integer id;
    // tytuł
    private String title;
}

Wysyłaj niestandardowe wiadomości

Blog blog = new Blog();
blog.setId(100);
blog.setTitle("Samouczek Tizi365 RabbitMQ");

// Wyślij wiadomość
template.convertAndSend(helloQueue.getName(), blog);

Odbieranie niestandardowych wiadomości typu

@RabbitHandler
// Po prostu zmień parametr metody na niestandardowy typ wiadomości
public void receive(Blog msg) {
    System.out.println("Odbiorca - Otrzymanie wiadomości '" + msg.getTitle() + "'");
}

Użyj serializacji JSON do treści wiadomości

Kiedy RabbitMQ wysyła dane obiektu encji Java, domyślnie używa narzędzia do serializacji obiektów JDK. Możemy zmienić to, aby używać formatu JSON do serializacji danych, co pozwala innym językom konsumować wiadomości wysłane przez Javę i sprawia, że format wiadomości jest bardziej czytelny.

Zmodyfikuj wcześniejszą klasę konfiguracyjną i dodaj poniższą konfigurację, aby użyć parsera JSON Jacksona do serializacji i deserializacji danych wiadomości.

@Bean
public Jackson2JsonMessageConverter messageConverter() {
    // Ustaw domyślny konwerter wiadomości
    return new Jackson2JsonMessageConverter();
}