본문 바로가기

대규모 시스템

RabbitMQ - Listener 구분하기

1. Key를 사용해 구분하기

메시지 전송

rabbitTemplate.convertAndSend("orderExchange", "order.create", "create");
rabbitTemplate.convertAndSend("orderExchange", "order.cancel", "cancel");

 

Listener 설정

@Component
public class OrderListener {

    @RabbitListener(queues = "orderQueue")
    public void handleOrderMessages(String message, @Header("amqp_receivedRoutingKey") String routingKey) {
        if ("order.create".equals(routingKey)) {
            System.out.println("Received order.create message: " + message);
            // 주문 생성 처리 로직
        } else if ("order.cancel".equals(routingKey)) {
            System.out.println("Received order.cancel message: " + message);
            // 주문 취소 처리 로직
        } else {
            System.out.println("Received unknown message with routing key: " + routingKey);
        }
    }
}

 

 

2. @RabbitHandler 사용하여 구분하기

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "orderQueue")
public class OrderListener {

    @RabbitHandler
    public void handleOrderCreate(OrderCreateMessage message) {
        System.out.println("Processing order create message: " + message);
        // 주문 생성 처리 로직
    }

    @RabbitHandler
    public void handleOrderCancel(OrderCancelMessage message) {
        System.out.println("Processing order cancel message: " + message);
        // 주문 취소 처리 로직
    }

    @RabbitHandler
    public void handleDefault(Object message) {
        System.out.println("Processing unknown type message: " + message);
        // 기본 처리 로직 (알 수 없는 타입의 메시지)
    }
}
  • 단점 : DTO를 주고 받을텐데 각 DTO를 계속 생성해서 전달해야 한다.

 

3. 작업마다 큐를 생성하여 구분하기

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class MessageListener {

    @RabbitListener(queues = "task_queue_create")
    public void receiveCreateMessage(String message) {
        System.out.println("Received CREATE message: " + message);
        // 처리 로직
    }

    @RabbitListener(queues = "task_queue_read")
    public void receiveReadMessage(String message) {
        System.out.println("Received READ message: " + message);
        // 처리 로직
    }

    @RabbitListener(queues = "task_queue_update")
    public void receiveUpdateMessage(String message) {
        System.out.println("Received UPDATE message: " + message);
        // 처리 로직
    }

    @RabbitListener(queues = "task_queue_delete")
    public void receiveDeleteMessage(String message) {
        System.out.println("Received DELETE message: " + message);
        // 처리 로직
    }
}

'대규모 시스템' 카테고리의 다른 글

RabbitMQ 라우팅 키로 구분하여 하나의 큐로 메세지 보내기  (0) 2024.09.05
SAGA Pattern  (0) 2024.08.14
Kafka 기본 설정  (0) 2024.08.14
Kafka란?  (0) 2024.08.14
RabbitMQ 기본 설정  (0) 2024.08.14