Skip to content

RabbitMQ ‐ RabbitMQ 설정

dnwls16071 edited this page Mar 15, 2025 · 1 revision

📚 비동기 메시지 소스 코드

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 : 수신한 메시지를 특정 클래스 특정 메서드로 전달하는 어댑터, 인자로 전달된 메서드를 자동으로 호출

📖 Java

📖 Kotlin

📖 Coroutine

📖 Spring

📖 Spring Security

📖 Spring Batch

📖 Reactive Programming

📖 Database

📖 MySQL

📖 Redis

📖 JPA

📖 QueryDsl

📖 MSA

📖 Kafka

📖 Apache Flink

  • [Apache Flink - Apache Flink Architecture]
  • [Apache Flink - Stream Processing]
  • [Apache Flink - Data Stream API & Window]
  • [Apache Flink - State Management]

📖 HTTP

📖 AWS

📖 Docker

📖 Kubernetes

📖 CI/CD

📖 Nginx

📖 Monitoring🥈

  • [Monitoring - Log Concept]
  • [Monitoring - Log Level & Filter]
  • [Monitoring - Logback]
  • [Monitoring - Log Collection with ELK Stack]
  • [Monitoring - Log Monitoring with Kibana]
  • [Monitoring - Building a Monitoring System with Spring Boot Actuator]
  • [Monitoring - Server Monitoring with Prometheus and Grafana with Discord Alerts]

📖 Test

📖 Effective Java 3/E

📖 Kotlin Academy - Effective Kotlin

📖 Kotlin Academy - 핵심편

📖 스프링으로 시작하는 리액티브 프로그래밍

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 1

📖 가상 면접 사례로 배우는 대규모 시스템 설계 기초 2

📖 Clean Code

📖 리팩토링 2판

📖 주니어 백엔드 개발자가 반드시 알아야 할 실무 지식

📖 GraphQL

Clone this wiki locally