Skip to content

Commit c5a6f20

Browse files
committed
step7 DLX와 DLQ를 이용한 재처리 (manual 모드 세팅)
1 parent d9830c5 commit c5a6f20

File tree

4 files changed

+12
-10
lines changed

4 files changed

+12
-10
lines changed

src/main/java/net/harunote/hellomessagequeue/step7/MessageConsumer.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,14 @@ public class MessageConsumer {
1313
private static final int MAX_RETRIES = 3;
1414
private int retryCount = 0; // 재시도 횟수 관리
1515

16+
// RabbitMQManualConfig에서 선언한 containerFactory 설정 추가
1617
@RabbitListener(queues = RabbitMQConfig.ORDER_COMPLETED_QUEUE, containerFactory = "rabbitListenerContainerFactory")
1718
public void processMessage(String message, Channel channel, @Header("amqp_deliveryTag") long tag) {
18-
System.out.println("[Order Queue Received]: " + message);
19-
2019
try {
2120
// 실패를 강제로 유발
2221
if ("fail".equalsIgnoreCase(message)) {
23-
System.out.println("### retryCount = " + retryCount);
24-
25-
if (retryCount < MAX_RETRIES -1) {
22+
if (retryCount < MAX_RETRIES) {
23+
System.err.println("# fail & retry = " + retryCount);
2624
retryCount++;
2725
throw new RuntimeException("- Processing failed. Retry count: " + retryCount);
2826
} else {
@@ -32,7 +30,6 @@ public void processMessage(String message, Channel channel, @Header("amqp_delive
3230
return;
3331
}
3432
}
35-
3633
// 성공 처리
3734
System.out.println("+ Message processed successfully: " + message);
3835
channel.basicAck(tag, false); // Ack 전송
@@ -41,7 +38,7 @@ public void processMessage(String message, Channel channel, @Header("amqp_delive
4138
} catch (Exception e) {
4239
System.err.println("# Error processing message: " + e.getMessage());
4340
try {
44-
// 실패 시 Nack 처리하여 메시지를 다시 처리
41+
// 실패 시 basicReject 처리하여 메시지를 다시 처리
4542
channel.basicReject(tag, true); // 재처리 가능하도록 Reject
4643
} catch (IOException ioException) {
4744
System.err.println("# Failed to reject message: " + ioException.getMessage());

src/main/java/net/harunote/hellomessagequeue/step7/OrderController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ public OrderController(OrderProducer orderProducer) {
2525
public ResponseEntity<String> sendMessage(@RequestParam String message) {
2626

2727
orderProducer.sendShpping(message);
28-
return ResponseEntity.ok("# Order Completed Message sent: " + message);
28+
return ResponseEntity.ok("Order Completed Message sent: " + message);
2929
}
3030
}

src/main/java/net/harunote/hellomessagequeue/step7/OrderProducer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public void sendShpping(String message) {
1818
RabbitMQConfig.ORDER_EXCHANGE,
1919
"order.completed.shipping",
2020
message);
21-
System.out.println("[주문 완료. 배송 지시 메시지 생성 : " + message);
21+
System.out.println("[주문 완료. 배송 지시 메시지 생성 : " + message + "]");
2222
}
2323
}

src/main/java/net/harunote/hellomessagequeue/step7/RabbitMQManualConfig.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@
77
import org.springframework.context.annotation.Bean;
88
import org.springframework.context.annotation.Configuration;
99

10+
/**
11+
* RabbitMQ 리스너의 설정을 커스터마이징 한다.
12+
*/
1013
@EnableRabbit
1114
@Configuration
1215
public class RabbitMQManualConfig {
1316

1417
@Bean
1518
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
19+
// RabbitMQ 리스너 컨테이너를 생성하는 팩토리 클래스
1620
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
1721
factory.setConnectionFactory(connectionFactory);
18-
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL); // 수동 Ack 모드 설정
22+
// 수동 Ack 모드 설정, 개발자는 메시지 처리 로직에서 명시적으로 메시지를 확인하거나 거부 처리 가능
23+
factory.setAcknowledgeMode(AcknowledgeMode.MANUAL);
1924
return factory;
2025
}
2126
}

0 commit comments

Comments
 (0)