feat(bll): IntervalService интервал рассчитывается правильно, с учетом времени выполнения основного метода, применена к Master, EsppOrderLoader, AIHIT.
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PARR.BLL\PARR.BLL.csproj" />
|
||||
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -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>();
|
||||
})
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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("=== === === === Конец синхронизации === === === ===");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user