From 9413dbbea8c52c4fb416ef70ee1b601c99d15739 Mon Sep 17 00:00:00 2001 From: Seonkyu_Kim Date: Thu, 27 Feb 2025 17:17:42 +0900 Subject: [PATCH] =?UTF-8?q?[=E2=99=BB=EF=B8=8F]=20PUSH=20API=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=A7=84=ED=96=89=20=EC=A4=91=5F?= =?UTF-8?q?4=20:=20=EB=8C=80=EC=9A=A9=EB=9F=89=20=EB=B0=9C=EC=8B=A0=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20=EB=B2=84=EC=A0=84=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Program/V1/Controllers/PushController.cs | 5 +- Program/V1/Services/InMemoryPushQueue.cs | 63 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 Program/V1/Services/InMemoryPushQueue.cs diff --git a/Program/V1/Controllers/PushController.cs b/Program/V1/Controllers/PushController.cs index f62b4dd..12c209e 100644 --- a/Program/V1/Controllers/PushController.cs +++ b/Program/V1/Controllers/PushController.cs @@ -12,13 +12,10 @@ namespace AcaMate.V1.Controllers; [ApiExplorerSettings(GroupName = "공통")] public class PushController : ControllerBase { - - private readonly IWebHostEnvironment _env; private readonly ILogger _logger; private readonly IPushQueue _pushQueue; - public PushController(IWebHostEnvironment env, ILogger logger, IPushQueue pushQueue) + public PushController(ILogger logger, IPushQueue pushQueue) { - _env = env; _logger = logger; _pushQueue = pushQueue; } diff --git a/Program/V1/Services/InMemoryPushQueue.cs b/Program/V1/Services/InMemoryPushQueue.cs new file mode 100644 index 0000000..2489771 --- /dev/null +++ b/Program/V1/Services/InMemoryPushQueue.cs @@ -0,0 +1,63 @@ + +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using AcaMate.V1.Models; +using Microsoft.Extensions.Hosting; + +namespace AcaMate.V1.Services; + +public interface IPushQueue +{ + void Enqueue(PushRequest request); + Task DequeueAsync(CancellationToken cancellationToken); +} + +public class InMemoryPushQueue: IPushQueue +{ + private readonly ConcurrentQueue _queue = new ConcurrentQueue(); + private readonly SemaphoreSlim _signal = new SemaphoreSlim(0); + + public void Enqueue(PushRequest request) + { + if( request is null ) + throw new ArgumentNullException(nameof(request)); + _queue.Enqueue(request); + _signal.Release(); + } + + public async Task DequeueAsync(CancellationToken cancellationToken) + { + await _signal.WaitAsync(cancellationToken); + _queue.TryDequeue(out var request); + return request; + } +} + +public class PushBackgroundService : BackgroundService +{ + private readonly IPushQueue _queue; + private readonly IApnsPushService _pushService; + + public PushBackgroundService(IPushQueue queue, IApnsPushService pushService) + { + _queue = queue; + _pushService = pushService; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + while (!stoppingToken.IsCancellationRequested) + { + var pushRequest = await _queue.DequeueAsync(stoppingToken); + try + { + await _pushService.SendPushNotificationAsync(pushRequest.deviceToken, pushRequest.payload); + } + catch (Exception ex) + { + Console.WriteLine($"푸시 전송 실패: {ex.Message}"); + } + } + } +} \ No newline at end of file