가장 간단한 Java RabbitMQ의 큐 모드는 프로듀서와 컨슈머로 구성되어 있습니다.
현재, RabbitMQ와의 Java 작업은 주로 Spring Boot의 spring-boot-starter-amqp
패키지를 사용하며, 본질적으로는 Spring AMQP를 사용하여 큐를 조작하고 있습니다.
1. 사전 튜토리얼
해당 지식을 이해하기 위해 다음 챕터들을 읽어주십시오:
2. 의존성 패키지
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3. RabbitMQ 구성
application.yml
구성을 수정하십시오:
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
4. 큐 선언
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() {
// 큐를 선언하고, 큐 이름은 고유해야 합니다
return new Queue("hello");
}
}
팁: 비즈니스 요구에 따라 여러 큐를 정의할 수 있습니다. 큐 이름과 Queue의 bean id는 달라야 합니다. 여기서 메소드 이름이 bean id입니다.
5. 메시지 전송
메시지 전송에는 RabbitTemplate 클래스가 필요하며, Spring Boot가 이미 우리를 위해 초기화했습니다. 인스턴스를 단순히 주입하면 됩니다:
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 {
// RabbitTemplate 인스턴스 주입
@Autowired
private RabbitTemplate template;
// 이전에 정의한 큐 주입
@Autowired
@Qualifier("helloQueue")
private Queue helloQueue;
// 데모를 위해 일정한 간격으로 메시지를 정기적으로 보내기 위해 Spring의 내장된 예약 작업을 사용합니다 (1초 당 메시지 전송)
@Scheduled(fixedDelay = 1000, initialDelay = 1000)
public void send() {
// 메시지 내용
String message = "Hello World!";
// 메시지 전송
// 첫 번째 매개변수는 라우팅 키이며, 여기서는 큐 이름을 라우팅 키로 사용합니다
// 두 번째 매개변수는 메시지 내용으로, 직렬화를 지원하는 모든 유형을 지원합니다
template.convertAndSend(helloQueue.getName(), message);
System.out.println("메시지 전송 중 '" + message + "'");
}
}
팁: 여기서 우리는 직접적으로 익스체인지를 사용하지 않고 있습니다. 기본 디렉트 익스체인지 (Default exchange)가 사용됩니다.
6. 메시지 수신
소비자가 메시지를 받는 것도 간단합니다:
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
// 메시지 리스너를 선언하고, `queues` 매개변수를 통해 듣기를 수행할 큐를 지정합니다. 이는 이전의 큐 이름과 일치해야 합니다
@RabbitListener(queues = "hello")
public class HelloListener {
// RabbitHandler를 사용하여 메시지 핸들러를 표시하고, 메시지 처리 로직을 실행합니다
@RabbitHandler
public void receive(String msg) {
System.out.println("소비자 - 받은 메시지 '" + msg + "'");
}
}
7. 사용자 정의 메시지 유형
이전에는 문자열 유형의 메시지를 보냈습니다. 실제 비즈니스 시나리오에서는 여러 사용자 지정 Java 객체 유형의 데이터를 직접적으로 보내기를 선호할 것입니다.
엔티티 객체 정의
package com.tizi365.rabbitmq.domain;
import java.io.Serializable;
import lombok.Data;
// 블로그 내용
@Data
public class Blog implements Serializable {
// 아이디
private Integer id;
// 제목
private String title;
}
사용자 정의 유형 메시지 전송
Blog blog = new Blog();
blog.setId(100);
blog.setTitle("Tizi365 RabbitMQ 튜토리얼");
// 메시지 전송
template.convertAndSend(helloQueue.getName(), blog);
@RabbitHandler
// 메서드 파라미터를 custom 메시지 타입으로 간단히 변경합니다
public void receive(Blog msg) {
System.out.println("소비자 - 메시지 받음 '" + msg.getTitle() + "'");
}
메시지 내용에 JSON 직렬화 사용하기
RabbitMQ가 Java 엔터티 객체 데이터를 보낼 때, 기본적으로 JDK의 객체 직렬화 도구를 사용합니다. 이를 데이터 직렬화를 위해 JSON 형식을 사용하도록 변경하여, 다른 언어가 Java에서 보낸 메시지를 사용할 수 있게 하고 메시지 형식을 더 읽기 쉽도록 만들 수 있습니다.
이전 구성 클래스를 수정하고 다음 구성을 추가하여 메시지 데이터의 직렬화와 역직렬화에 Jackson JSON 파서를 사용하도록 변경합니다.
@Bean
public Jackson2JsonMessageConverter messageConverter() {
// 기본 메시지 컨버터 설정
return new Jackson2JsonMessageConverter();
}