From d7aad4fe9e463c63945a423cf27253fbec9fae01 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 30 Nov 2023 09:11:07 +1000 Subject: [PATCH] =?UTF-8?q?feat(bll):=20IntervalService=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D0=B2=D0=B0=D0=BB=20=D1=80=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D1=8B=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D1=8C=D0=BD=D0=BE,=20?= =?UTF-8?q?=D1=81=20=D1=83=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20=D0=B2=D1=80?= =?UTF-8?q?=D0=B5=D0=BC=D0=B5=D0=BD=D0=B8=20=D0=B2=D1=8B=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?,=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=BA=20Master,=20EsppOrderLoader,=20AIHIT.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.AIHIT/AIHIT/PARR.AIHIT.csproj | 1 + .../Implementations/IntervalService.cs | 20 ++++++- PARR.Test/PARR.Test.csproj | 1 + PARR.Test/Program.cs | 2 + PARR.Test/Worker.cs | 14 ++++- .../PARR.Worker/PARR.AIHITWorker.csproj | 2 - PARR.Worker/PARR.Worker/Worker.cs | 57 +++++++++++++------ 7 files changed, 74 insertions(+), 23 deletions(-) diff --git a/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj b/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj index 37b4e1d0..fdfd5289 100644 --- a/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj +++ b/PARR.AIHIT/AIHIT/PARR.AIHIT.csproj @@ -13,6 +13,7 @@ + diff --git a/PARR.BLL/Services/Implementations/IntervalService.cs b/PARR.BLL/Services/Implementations/IntervalService.cs index 130e8710..a39f8ef5 100644 --- a/PARR.BLL/Services/Implementations/IntervalService.cs +++ b/PARR.BLL/Services/Implementations/IntervalService.cs @@ -14,15 +14,29 @@ namespace PARR.BLL.Services.Implementations public async Task IntervalInitAsync(IntervalHandlerDelegate intervalHandler, TimeSpan interval) { + var nextStart = DateTimeOffset.UtcNow; + while (true) { - logger.LogInformation($"Запуск по расписанию. Интервал: {interval}"); + nextStart = DateTimeOffset.UtcNow; + + logger.LogInformation($"Запуск по расписанию. Интервал: {interval}, дата: {nextStart}"); await intervalHandler.Invoke(); - logger.LogInformation($"Следующая дата запуска: {DateTimeOffset.Now.Add(interval)}"); + nextStart = nextStart.Add(interval); - await Task.Delay(interval); + logger.LogInformation($"Следующая дата запуска: {nextStart}"); + + var intervalOffset = nextStart - DateTimeOffset.UtcNow; + if (intervalOffset < TimeSpan.Zero) + { + intervalOffset = TimeSpan.Zero; + logger.LogWarning($"Время следующего запуска изменено на сейчас. Так как рассчитанное время запуска меньше чем сейчас, {nextStart}<{DateTimeOffset.UtcNow}. " + + $"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений."); + } + + await Task.Delay(intervalOffset); } } } diff --git a/PARR.Test/PARR.Test.csproj b/PARR.Test/PARR.Test.csproj index b041f721..9e2e7411 100644 --- a/PARR.Test/PARR.Test.csproj +++ b/PARR.Test/PARR.Test.csproj @@ -16,6 +16,7 @@ + diff --git a/PARR.Test/Program.cs b/PARR.Test/Program.cs index 78fca86f..44f93843 100644 --- a/PARR.Test/Program.cs +++ b/PARR.Test/Program.cs @@ -1,3 +1,4 @@ +using PARR.BLL; using PARR.EsppApi; using PARR.Test; using Serilog; @@ -6,6 +7,7 @@ IHost host = Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.InstallEsppApiServices(hostContext.Configuration); + services.InstallBllServices(hostContext.Configuration); services.AddHostedService(); }) diff --git a/PARR.Test/Worker.cs b/PARR.Test/Worker.cs index 479dda86..10d977e5 100644 --- a/PARR.Test/Worker.cs +++ b/PARR.Test/Worker.cs @@ -1,3 +1,4 @@ +using PARR.BLL.Services.Interfaces; using PARR.EsppApi; using PARR.EsppApi.Constants; using PARR.EsppApi.Models.Query; @@ -8,15 +9,26 @@ namespace PARR.Test { private readonly ILogger _logger; private readonly IEsppApiService esppApiService; + private readonly IIntervalService intervalService; - public Worker(ILogger logger, IEsppApiService esppApiService) + public Worker(ILogger logger, IEsppApiService esppApiService, IIntervalService intervalService) { _logger = logger; this.esppApiService = esppApiService; + this.intervalService = intervalService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { + ////test interval + //await intervalService.IntervalInitAsync(async () => + //{ + // _logger.LogInformation("---Выполняю метод---"); + // await Task.Delay(29*1000); + // _logger.LogInformation("===Выполнил метод==="); + //}, new TimeSpan(0, 0, 30)); + + await TestEsppApi(); } diff --git a/PARR.Worker/PARR.Worker/PARR.AIHITWorker.csproj b/PARR.Worker/PARR.Worker/PARR.AIHITWorker.csproj index 9b6347fb..6ec0d9c6 100644 --- a/PARR.Worker/PARR.Worker/PARR.AIHITWorker.csproj +++ b/PARR.Worker/PARR.Worker/PARR.AIHITWorker.csproj @@ -22,7 +22,5 @@ - - diff --git a/PARR.Worker/PARR.Worker/Worker.cs b/PARR.Worker/PARR.Worker/Worker.cs index 53b4cf95..bc6c9ad5 100644 --- a/PARR.Worker/PARR.Worker/Worker.cs +++ b/PARR.Worker/PARR.Worker/Worker.cs @@ -1,4 +1,5 @@ using PARR.AIHIT; +using PARR.BLL.Services.Interfaces; using PARR.Worker.Settings; namespace PARR.Worker @@ -8,42 +9,64 @@ namespace PARR.Worker private readonly ILogger logger; private readonly IServiceProvider serviceProvider; private readonly WorkerSettings workerSettings; + private readonly IIntervalService intervalService; - public Worker(ILogger logger, + public Worker( + ILogger logger, IServiceProvider serviceProvider, - WorkerSettings workerSettings + WorkerSettings workerSettings, + IIntervalService intervalService ) { this.logger = logger; this.serviceProvider = serviceProvider; this.workerSettings = workerSettings; + this.intervalService = intervalService; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { logger.LogInformation("--- Сервис запущен! ---"); - while (!stoppingToken.IsCancellationRequested) - { - logger.LogInformation("--- --- --- --- Начало синхронизации --- --- --- ---"); - using var scope = serviceProvider.CreateScope(); - var services = scope.ServiceProvider; - var syncer = services.GetService(); - if (syncer != null) await syncer.InvokeFromDatabase(); + await intervalService.IntervalInitAsync(RunAihitSyncAsync, workerSettings.OccursEvery); - //var hosts = await hostService.Get().ToListAsync(); - //foreach ( var host in hosts ) { logger.LogInformation($"{host.HostName}"); } + //while (!stoppingToken.IsCancellationRequested) + //{ + // logger.LogInformation("--- --- --- --- Начало синхронизации --- --- --- ---"); + // using var scope = serviceProvider.CreateScope(); + // var services = scope.ServiceProvider; + // var syncer = services.GetService(); + + // if (syncer != null) await syncer.InvokeFromDatabase(); + + // //var hosts = await hostService.Get().ToListAsync(); + // //foreach ( var host in hosts ) { logger.LogInformation($"{host.HostName}"); } - //await attachmentUploader.UploadAsync(); - //logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - logger.LogInformation("=== === === === Конец синхронизации === === === ==="); + // //await attachmentUploader.UploadAsync(); + // //logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); + // logger.LogInformation("=== === === === Конец синхронизации === === === ==="); - var mills = (int?) workerSettings?.OccursEvery.TotalMilliseconds ?? 60*1000; - await Task.Delay(mills, stoppingToken); + // var mills = (int?) workerSettings?.OccursEvery.TotalMilliseconds ?? 60*1000; + // await Task.Delay(mills, stoppingToken); - } + //} + } + + + private async Task RunAihitSyncAsync() + { + logger.LogInformation("--- --- --- --- Начало синхронизации --- --- --- ---"); + + using var scope = serviceProvider.CreateScope(); + var services = scope.ServiceProvider; + var syncer = services.GetService(); + + if (syncer != null) + await syncer.InvokeFromDatabase(); + + logger.LogInformation("=== === === === Конец синхронизации === === === ==="); } } } \ No newline at end of file