2023-11-29 15:59:27 +10:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Core.Common.Interfaces;
|
2023-11-29 15:59:27 +10:00
|
|
|
|
|
2026-04-14 13:49:43 +10:00
|
|
|
|
namespace PARR.Infrastructure.Interval
|
2023-11-29 15:59:27 +10:00
|
|
|
|
{
|
|
|
|
|
|
internal class IntervalService : IIntervalService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly ILogger<IntervalService> logger;
|
|
|
|
|
|
|
|
|
|
|
|
public IntervalService(ILogger<IntervalService> logger)
|
|
|
|
|
|
{
|
|
|
|
|
|
this.logger = logger;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-04-14 13:49:43 +10:00
|
|
|
|
//public async Task IntervalInitAsync(IntervalHandlerDelegate intervalHandler, TimeSpan interval)
|
|
|
|
|
|
public async Task IntervalInitAsync(Func<Task> handler, TimeSpan interval)
|
2023-11-29 15:59:27 +10:00
|
|
|
|
{
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogInformation("Инициализация интервального сервиса с интервалом: {Interval}", interval);
|
|
|
|
|
|
|
2023-11-30 09:11:07 +10:00
|
|
|
|
var nextStart = DateTimeOffset.UtcNow;
|
|
|
|
|
|
|
2023-11-29 15:59:27 +10:00
|
|
|
|
while (true)
|
|
|
|
|
|
{
|
2023-11-30 09:11:07 +10:00
|
|
|
|
nextStart = DateTimeOffset.UtcNow;
|
|
|
|
|
|
|
2026-01-23 09:28:14 +10:00
|
|
|
|
logger.LogInformation("Запуск по расписанию. Интервал: {interval}, дата: {nextStart}", interval, nextStart);
|
2023-11-29 15:59:27 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
try
|
|
|
|
|
|
{
|
2026-04-14 13:49:43 +10:00
|
|
|
|
await handler.Invoke();
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
logger.LogError(ex, "Ошибка при выполнении интервального обработчика");
|
|
|
|
|
|
}
|
2023-11-29 15:59:27 +10:00
|
|
|
|
|
2023-11-30 09:11:07 +10:00
|
|
|
|
nextStart = nextStart.Add(interval);
|
|
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogInformation("Следующая дата запуска: {NextStart}. Интервал: {Interval}.", nextStart, interval);
|
2023-11-30 09:11:07 +10:00
|
|
|
|
|
|
|
|
|
|
var intervalOffset = nextStart - DateTimeOffset.UtcNow;
|
|
|
|
|
|
if (intervalOffset < TimeSpan.Zero)
|
|
|
|
|
|
{
|
|
|
|
|
|
intervalOffset = TimeSpan.Zero;
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogWarning(
|
|
|
|
|
|
"Время следующего запуска изменено на текущее время. Рассчитанное время запуска ({NextStart}) меньше текущего времени ({Now}). " +
|
|
|
|
|
|
"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений.",
|
|
|
|
|
|
nextStart,
|
|
|
|
|
|
DateTimeOffset.UtcNow);
|
2023-11-30 09:11:07 +10:00
|
|
|
|
}
|
2023-11-29 15:59:27 +10:00
|
|
|
|
|
2026-02-09 12:00:46 +10:00
|
|
|
|
logger.LogDebug("Ожидание {Delay} перед следующим запуском", intervalOffset);
|
|
|
|
|
|
|
2023-11-30 09:11:07 +10:00
|
|
|
|
await Task.Delay(intervalOffset);
|
2023-11-29 15:59:27 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-02-09 12:00:46 +10:00
|
|
|
|
}
|