이슈
Spring에서 Message Queue RabbitMQ 설정 후 구동하면 아래와 같은 이슈가 발생하는 경우
channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no queue "Queue-Name" in vhost ....
원인
메세지 리스너 컨테이너에 설정된 Queue가 없기 때문에 발생한다.
만약 개발 중인 경우 404가 아닌 다른 에러라면, 보통 기존에 만들어진 Queue와 새로 바라보려는 Queue 옵션정보가 달라 이에 대한 에러를 내뱉는 경우가 있다. 이 경우엔 큐를 아예 삭제 처리 하고 진행하는 것을 추천한다.
해결
환경 : Spring framework 6.1 / RabbitMQ 3.13.0
@Bean
public Queue testQueue() {
final boolean isDurable = true; // durable이 true인 경우 disk을 사용하여 물리적 저장처리
final boolean isExclusive = false;
final boolean autoDelete = false;
return new Queue("test_queue", isDurable, isExclusive, autoDelete);
}
@Bean
public Queue testQueue2() {
final boolean isDurable = false;
final boolean isExclusive = false;
final boolean autoDelete = false;
return new Queue("test_queue2", isDurable, isExclusive, autoDelete);
}
// [해결] amqpAdmin 내에 declareQueue를 통해 큐를 등록해줌으로써 없는경우라면 생성을 해준다.
@Bean
public AmqpAdmin amqpAdmin() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
rabbitAdmin.declareQueue(testQueue());
rabbitAdmin.declareQueue(testQueue2());
return rabbitAdmin;
}
// 참고
@Bean
public SimpleMessageListenerContainer messageListenerContainer(CachingConnectionFactory connectionFactory, CustomQueueReceiver receiver) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setAutoDeclare(true);
container.setQueueNames("test_queue", "test_queue2"); // 리스닝할 큐 이름 지정
container.setMessageListener(receiver); // 리스너 등록
container.setConcurrentConsumers(1); // 병렬 소비자 수 지정
container.setPrefetchCount(50); // 한 번에 받아올 메시지의 최대 수 지정
container.setDeclarationRetries(2);
return container;
}
더보기
CustomReceiver.java 예제
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.rabbitmq.client.Channel;
import lombok.RequiredArgsConstructor;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
@Component
@RequiredArgsConstructor
public class CustomQueueReceiver implements ChannelAwareMessageListener {
private final TestService testService;
private final RabbitTemplate rabbitTemplate;
@Override
public void onMessage(Message message, Channel channel) throws JsonProcessingException {
// message 를 ObjectMapper 를 통해 지정된 Class 객체로 변환하여 사용하는 구간
}
}
반응형
'자바 > Spring Framework' 카테고리의 다른 글
[Spring boot3] SpringDoc - OpenAPI Servers url 수정 (0) | 2024.10.02 |
---|---|
RabbitMQ Request Reply 패턴 (0) | 2024.04.22 |
스프링 6.1 로 업그레이드시 매개변수,빈 인식 불가현상 (0) | 2023.12.12 |
lucy-xss-servlet-filter Spring 6 용 JAR 빌드/적용 (2) (0) | 2023.08.17 |