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