Il modo più semplice di coda in Java RabbitMQ consiste in un produttore e un consumatore.

RabbitMQ Simple Queue

Attualmente, le operazioni Java con RabbitMQ utilizzano principalmente il pacchetto spring-boot-starter-amqp di Spring Boot, che essenzialmente utilizza Spring AMQP per operare sulla coda.

1. Tutorial preliminare

Si prega di leggere i seguenti capitoli per comprendere le conoscenze rilevanti:

2. Pacchetto di dipendenze

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

3. Configurare RabbitMQ

Modificare la configurazione application.yml:

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

4. Dichiarare la coda

Configurare la coda attraverso la classe di configurazione di 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() {
        // Dichiarare la coda e il nome della coda deve essere univoco
        return new Queue("hello");
    }
}

Suggerimento: È possibile definire più code in base alle esigenze commerciali. Il nome della coda e l'id del bean di Queue devono essere diversi. Qui, il nome del metodo è l'id del bean.

5. Inviare un messaggio

L'invio di messaggi richiede la classe RabbitTemplate, che Spring Boot ha già inizializzato per noi. Basta iniettare l'istanza:

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 {
    // Iniettare l'istanza RabbitTemplate
    @Autowired
    private RabbitTemplate template;
    
    // Iniettare la coda precedentemente definita
    @Autowired
    @Qualifier("helloQueue")
    private Queue helloQueue;
    
    // A scopo dimostrativo, utilizziamo il compito pianificato integrato di Spring per inviare regolarmente messaggi (un messaggio al secondo)
    @Scheduled(fixedDelay = 1000, initialDelay = 1000)
    public void send() {
        // Contenuto del messaggio
        String message = "Ciao mondo!";
        // Inviare il messaggio
        // Il primo parametro è la chiave di routing, qui utilizziamo il nome della coda come chiave di routing
        // Il secondo parametro è il contenuto del messaggio, supporta qualsiasi tipo purché supporti la serializzazione
        template.convertAndSend(helloQueue.getName(), message);
        System.out.println("Inviando il messaggio '" + message + "'");
    }
}

Suggerimento: Qui, non stiamo usando direttamente lo scambio. Verrà utilizzato lo scambio predefinito sottostante (scambio diretto).

6. Ricevere un messaggio

Anche per il consumatore è semplice ricevere i messaggi:

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
// Dichiarare il listener del messaggio, specificare la coda su cui ascoltare tramite il parametro `queues`, che deve essere coerente con il nome della coda precedente
@RabbitListener(queues = "hello")
public class HelloListener {
	// Utilizzare RabbitHandler per marcare il gestore del messaggio, utilizzato per eseguire la logica di elaborazione del messaggio
    @RabbitHandler
    public void receive(String msg) {
        System.out.println("Consumatore - Messaggio ricevuto '" + msg + "'");
    }
}

7. Tipo di messaggio personalizzato

Precedentemente, abbiamo inviato un messaggio di tipo stringa. Nei casi pratici, preferiremmo inviare direttamente vari tipi di oggetti Java personalizzati.

Definire un oggetto entità

package com.tizi365.rabbitmq.domain;

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

// Contenuto del blog
@Data
public class Blog implements Serializable {
    // id
    private Integer id;
    // titolo
    private String title;
}

Inviare messaggi di tipo personalizzato

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

// Inviare il messaggio
template.convertAndSend(helloQueue.getName(), blog);

Ricezione di messaggi di tipo personalizzato

@RabbitHandler
// Basta cambiare il parametro del metodo con il tipo di messaggio personalizzato
public void receive(Blog msg) {
    System.out.println("Consumatore - Messaggio ricevuto '" + msg.getTitle() + "'");
}

Utilizzo della serializzazione JSON per il contenuto del messaggio

Quando RabbitMQ invia dati di oggetto di tipo entità Java, di default utilizza lo strumento di serializzazione degli oggetti JDK. Possiamo modificarlo per utilizzare il formato JSON per la serializzazione dei dati, consentendo ad altri linguaggi di consumare i messaggi inviati da Java e rendendo il formato del messaggio più leggibile.

Modificare la classe di configurazione precedente e aggiungere la seguente configurazione per utilizzare il parser JSON Jackson per la serializzazione e deserializzazione dei dati del messaggio.

@Bean
public Jackson2JsonMessageConverter messageConverter() {
    // Imposta il convertitore di messaggi predefinito
    return new Jackson2JsonMessageConverter();
}