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

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