From 4f806ecdb1bf8b61b541804abe184e4d96edd612 Mon Sep 17 00:00:00 2001 From: "seonkyu.kim" Date: Tue, 10 Feb 2026 19:05:13 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20RabbitMQ=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EC=8B=A4=ED=8C=A8=20=EC=8B=9C=20=EC=95=B1=20=ED=81=AC=EB=9E=98?= =?UTF-8?q?=EC=8B=9C=20=EB=B0=A9=EC=A7=80=20(#124)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - StartAsync에서 throw 제거, LogWarning으로 변경 - InitializeAsync 메서드 분리 (재시도 가능) Co-Authored-By: Claude Opus 4.6 --- .../Messaging/RabbitMQInitializer.cs | 111 +++++++++--------- 1 file changed, 56 insertions(+), 55 deletions(-) diff --git a/SPMS.Infrastructure/Messaging/RabbitMQInitializer.cs b/SPMS.Infrastructure/Messaging/RabbitMQInitializer.cs index 1c22bba..7926e2f 100644 --- a/SPMS.Infrastructure/Messaging/RabbitMQInitializer.cs +++ b/SPMS.Infrastructure/Messaging/RabbitMQInitializer.cs @@ -26,66 +26,67 @@ public class RabbitMQInitializer : IHostedService { try { - await using var channel = await _connection.CreateChannelAsync(cancellationToken); - - // Exchange 선언: Direct, Durable - await channel.ExchangeDeclareAsync( - exchange: _settings.Exchange, - type: ExchangeType.Direct, - durable: true, - autoDelete: false, - arguments: null, - cancellationToken: cancellationToken); - - _logger.LogInformation("Exchange 선언 완료: {Exchange}", _settings.Exchange); - - var queueArgs = new Dictionary - { - { "x-message-ttl", _settings.MessageTtl } - }; - - // Push Queue 선언 - await channel.QueueDeclareAsync( - queue: _settings.PushQueue, - durable: true, - exclusive: false, - autoDelete: false, - arguments: queueArgs, - cancellationToken: cancellationToken); - - await channel.QueueBindAsync( - queue: _settings.PushQueue, - exchange: _settings.Exchange, - routingKey: "push", - cancellationToken: cancellationToken); - - _logger.LogInformation("Queue 선언 및 바인딩 완료: {Queue} → {Exchange} (routing_key: push)", - _settings.PushQueue, _settings.Exchange); - - // Schedule Queue 선언 - await channel.QueueDeclareAsync( - queue: _settings.ScheduleQueue, - durable: true, - exclusive: false, - autoDelete: false, - arguments: queueArgs, - cancellationToken: cancellationToken); - - await channel.QueueBindAsync( - queue: _settings.ScheduleQueue, - exchange: _settings.Exchange, - routingKey: "schedule", - cancellationToken: cancellationToken); - - _logger.LogInformation("Queue 선언 및 바인딩 완료: {Queue} → {Exchange} (routing_key: schedule)", - _settings.ScheduleQueue, _settings.Exchange); + await InitializeAsync(cancellationToken); } catch (Exception ex) { - _logger.LogError(ex, "RabbitMQ Exchange/Queue 초기화 실패"); - throw; + _logger.LogWarning(ex, "RabbitMQ 초기화 실패 — 서버는 계속 실행됩니다. 메시지 발송 시 재연결을 시도합니다."); } } + public async Task InitializeAsync(CancellationToken cancellationToken) + { + await using var channel = await _connection.CreateChannelAsync(cancellationToken); + + await channel.ExchangeDeclareAsync( + exchange: _settings.Exchange, + type: ExchangeType.Direct, + durable: true, + autoDelete: false, + arguments: null, + cancellationToken: cancellationToken); + + _logger.LogInformation("Exchange 선언 완료: {Exchange}", _settings.Exchange); + + var queueArgs = new Dictionary + { + { "x-message-ttl", _settings.MessageTtl } + }; + + await channel.QueueDeclareAsync( + queue: _settings.PushQueue, + durable: true, + exclusive: false, + autoDelete: false, + arguments: queueArgs, + cancellationToken: cancellationToken); + + await channel.QueueBindAsync( + queue: _settings.PushQueue, + exchange: _settings.Exchange, + routingKey: "push", + cancellationToken: cancellationToken); + + _logger.LogInformation("Queue 선언 및 바인딩 완료: {Queue} → {Exchange} (routing_key: push)", + _settings.PushQueue, _settings.Exchange); + + await channel.QueueDeclareAsync( + queue: _settings.ScheduleQueue, + durable: true, + exclusive: false, + autoDelete: false, + arguments: queueArgs, + cancellationToken: cancellationToken); + + await channel.QueueBindAsync( + queue: _settings.ScheduleQueue, + exchange: _settings.Exchange, + routingKey: "schedule", + cancellationToken: cancellationToken); + + _logger.LogInformation("Queue 선언 및 바인딩 완료: {Queue} → {Exchange} (routing_key: schedule)", + _settings.ScheduleQueue, _settings.Exchange); + } + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; }