From 7989b5dc930733d500b832ac6fc2e60bfc830fb9 Mon Sep 17 00:00:00 2001 From: jmj Date: Sun, 31 May 2026 22:53:14 +0900 Subject: [PATCH] =?UTF-8?q?fix(messaging):=20publishToAi=20=EC=8B=9C=20tra?= =?UTF-8?q?ceId=20MDC=20=EB=88=84=EB=9D=BD=20=EC=8B=9C=20=EC=83=88=20UUID?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 운영 검증 중 발견. callback handler 흐름에서 자동 발화된 SessionEndedEvent → SessionFeedbackRequester.publishToAi 호출 시 MDC 에 traceId 가 없어 envelope.traceId=null 로 발행. AI 측 Envelope[T] 의 traceId 가 string required 라 Pydantic ValidationError ('Input should be a valid string [...] input_value=None') 로 메시지 거절. 해결: publishToAi 내부에 fallback — MDC traceId null/blank 면 UUID.randomUUID() 채움. JwtAuthenticationFilter 흐름은 MDC 가 채워져 있고, RabbitListener/TransactionalEventListener 흐름은 이 fallback 으로 균일하게 traceId 보장. 증상: 운영 골든패스 (Sprint3 verify, sessionId=4) 에서 - SessionFeedbackRequester: generate.feedback published. (정상) - feedback consumer: feedback.parse.failed traceId: Input should be a valid string - /api/sessions/4/feedback 무한 FEEDBACK_NOT_READY --- .../stackup/common/messaging/RabbitMessagePublisher.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/com/stackup/stackup/common/messaging/RabbitMessagePublisher.java b/backend/src/main/java/com/stackup/stackup/common/messaging/RabbitMessagePublisher.java index 56876f4d..56e64827 100644 --- a/backend/src/main/java/com/stackup/stackup/common/messaging/RabbitMessagePublisher.java +++ b/backend/src/main/java/com/stackup/stackup/common/messaging/RabbitMessagePublisher.java @@ -20,11 +20,16 @@ public RabbitMessagePublisher(RabbitMqProperties properties, RabbitTemplate rabb } public MessageEnvelope publishToAi(String routingKey, T payload, MessageContext context) { + String traceId = TraceContext.getTraceId(); + if (traceId == null || traceId.isBlank()) { + // RabbitListener / EventListener 등에서 MDC 미주입 흐름 — 발행 시점에 새 traceId 생성. + traceId = UUID.randomUUID().toString(); + } MessageEnvelope envelope = new MessageEnvelope<>( UUID.randomUUID().toString(), routingKey, properties.version(), - TraceContext.getTraceId(), + traceId, Instant.now(), properties.publisher(), payload,