RabbitMQ ‐ RabbitMQ 설정 - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 비동기 메시지 소스 코드
package com.jwj.order.rabbitmq;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer;
import org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMqConfig {
public static final String ORDER_EXCHANGE = "ORDER_EXCHANGE"; // 주문 익스체인지
public static final String ORDER_QUEUE = "ORDER_QUEUE"; // 주문 대기열
public static final String ORDER_ROUTING_KEY = "ORDER_CREATED"; // 주문 라우팅 키
public static final String DEADLETTER_EXCHANGE = "DEAD_LETTER_EXCHANGE";
public static final String DEADLETTER_QUEUE = "DEAD_LETTER_QUEUE";
public static final String DEADLETTER_ROUTING_KEY = "DEAD_LETTER";
// Message Converter
@Bean
public MessageConverter messageConverter() {
return new Jackson2JsonMessageConverter();
}
// RabbitTemplate
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
rabbitTemplate.setMessageConverter(messageConverter());
return rabbitTemplate;
}
// SimpleMessageListenerContainer
@Bean
public SimpleMessageListenerContainer simpleMessageListenerContainer(ConnectionFactory connectionFactory, MessageListenerAdapter adapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setMessageListener(adapter);
container.setQueueNames(ORDER_QUEUE);
container.setPrefetchCount(10); // prefetchCount = 최적화 요소
return container;
}
// MessageListenerAdapter
@Bean
public MessageListenerAdapter messageListenerAdapter(OrderConsumer consumer) {
return new MessageListenerAdapter(consumer);
}
// DLX(DeadLetterExchange)
@Bean
public DirectExchange deadLetterExchange() {
return new DirectExchange(DEADLETTER_EXCHANGE);
}
// DLQ(DeadLetterQueue)
@Bean
public Queue deadLetterQueue() {
return QueueBuilder.durable(DEADLETTER_QUEUE)
.build();
}
// DLQ와 DLX 연결
@Bean
public Binding deadLetterBinding() {
return BindingBuilder.bind(deadLetterQueue())
.to(deadLetterExchange())
.with(DEADLETTER_ROUTING_KEY);
}
// 주문 Exchange
@Bean
public TopicExchange orderExchange() {
return new TopicExchange(ORDER_EXCHANGE);
}
// 주문 Queue
@Bean
public Queue orderQueue() {
return QueueBuilder.durable(ORDER_QUEUE)
.withArgument("x-dead-letter-exchange", DEADLETTER_EXCHANGE)
.withArgument("x-dead-letter-routing-key", DEADLETTER_ROUTING_KEY)
.build();
}
// 주문 Binding
@Bean
public Binding orderBinding() {
return BindingBuilder.bind(orderQueue())
.to(orderExchange())
.with(ORDER_ROUTING_KEY);
}
}
- Queue : Queue 인스턴스를 생성하고 애플리케이션이 사용할 큐를 정의, 메시지를 전달하고 처리하는 기본 큐를 세팅
- RabbitTemplate : RabbitMQ와 통신하기 위한 템플릿 인스턴스로 메시지 송수신용에 사용도니다.
- SimpleMessageListener : RabbitMQ 메시지를 비동기적으로 수신하기 위해 SimpleMessageListenerContainer를 생성, 이 컨테이너가 특정 큐를 지속적으로 모니터링하고 메시지를 수신하면 지정된 리스너를 통해 처리한다.
- MessageListenerAdapter : 수신한 메시지를 특정 클래스 특정 메서드로 전달하는 어댑터, 인자로 전달된 메서드를 자동으로 호출