feat(bll): IntervalService интервал рассчитывается правильно, с учетом времени выполнения основного метода, применена к Master, EsppOrderLoader, AIHIT.

This commit is contained in:
Mikhail Trubnikov
2023-11-30 09:11:07 +10:00
parent 8d63a10581
commit d7aad4fe9e
7 changed files with 74 additions and 23 deletions

View File

@@ -13,6 +13,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\PARR.BLL\PARR.BLL.csproj" />
<ProjectReference Include="..\..\PARR.DAL\PARR.DAL.csproj" />
<ProjectReference Include="..\..\PARR.Mail\PARR.Mail\PARR.Mail.csproj" />
</ItemGroup>

View File

@@ -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);
}
}
}

View File

@@ -16,6 +16,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
</ItemGroup>
</Project>

View File

@@ -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<Worker>();
})

View File

@@ -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<Worker> _logger;
private readonly IEsppApiService esppApiService;
private readonly IIntervalService intervalService;
public Worker(ILogger<Worker> logger, IEsppApiService esppApiService)
public Worker(ILogger<Worker> 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();
}

View File

@@ -22,7 +22,5 @@
<ItemGroup>
<ProjectReference Include="..\..\PARR.AIHIT\AIHIT\PARR.AIHIT.csproj" />
<ProjectReference Include="..\..\PARR.DAL\PARR.DAL.csproj" />
<ProjectReference Include="..\..\PARR.Mail\PARR.Mail\PARR.Mail.csproj" />
</ItemGroup>
</Project>

View File

@@ -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<Worker> logger;
private readonly IServiceProvider serviceProvider;
private readonly WorkerSettings workerSettings;
private readonly IIntervalService intervalService;
public Worker(ILogger<Worker> logger,
public Worker(
ILogger<Worker> 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<ISyncher>();
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<ISyncher>();
// 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<ISyncher>();
if (syncer != null)
await syncer.InvokeFromDatabase();
logger.LogInformation("=== === === === Конец синхронизации === === === ===");
}
}
}