본문 바로가기
개발자 경험 & 팁

RabbitMQ - 406 에러

by DoRightting 2024. 10. 19.
  • channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
    • 원인 :
      • 기존에 생성된 큐의 설정과 현재 애플리케이션에서 설정하려는 큐의 속성이 일치하지 않아서 발생함.
      • 특히 메시지 승인 과정에서 일반적으로 발생하는데, Quere를 선언하는 부분이 두곳이었고, 다른 클래스로 큐가 선언되고 있었음.
    • 해결 : 큐는 singleton으로 구현되어야 하기 때문에, 큐 설정을 다르게 하고 같은 이름을 쓰거나 두 곳에서 중복적으로 선언하면 오류가 남.
    • Publisher와 Producer 통합.
package com.gameservice.create_game_resource_service.messaging;

import com.gameservice.create_game_resource_service.config.RabbitMQConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class GameResourcePublisher {

    private final RabbitTemplate rabbitTemplate;

    public GameResourcePublisher(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        try {
            rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.QUEUE_NAME, message);
            log.info("Message sent successfully to exchange: {}", message);
        } catch (AmqpException e) {
            log.error("Failed to send message: {}", message, e);
        }
    }
}

 

package com.gameservice.create_game_resource_service.service;

import com.gameservice.create_game_resource_service.model.GameResourceCreationMessage;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
public class RabbitMQProducer {

    private final RabbitTemplate rabbitTemplate;
    private static final String QUEUE_NAME = "game-resource-queue";

    @Autowired
    public RabbitMQProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendGameResourceCreationMessage(GameResourceCreationMessage message) {
        try {
            rabbitTemplate.convertAndSend(QUEUE_NAME, message);            
        } catch (AmqpException e) {
            log.error("게임 리소스 생성 메시지를 큐에 전송 실패", e);            
        }
    }
}

 

package com.gameservice.create_game_resource_service.messaging;

import com.gameservice.create_game_resource_service.config.RabbitMQConfig;
import com.gameservice.create_game_resource_service.model.GameResourceCreationMessage;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class GameResourceProducer {

    private final RabbitTemplate rabbitTemplate;

    public GameResourceProducer(RabbitTemplate rabbitTemplate) {
        this.rabbitTemplate = rabbitTemplate;
    }

    public void sendMessage(String message) {
        try {
            rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.QUEUE_NAME, message);
            log.info("Message sent successfully to exchange: {}", message);
        } catch (AmqpException e) {
            log.error("Failed to send message: {}", message, e);
        }
    }

    public void sendGameResourceCreationMessage(GameResourceCreationMessage message) {
        try {
            rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME, message);            
        } catch (AmqpException e) {
            log.error("게임 리소스 생성 메시지를 큐에 전송 실패", e);            
        }
    }
}

'개발자 경험 & 팁' 카테고리의 다른 글

배치 처리  (0) 2024.11.19
git pull 실패  (0) 2024.07.30
exception just for purpose of providing stack trace 오류  (0) 2024.07.23
MariaDB 설치 오류  (0) 2024.07.18