Najprostszy tryb kolejki w Java RabbitMQ składa się z producenta i konsumenta.
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();
}