feat: Перенесен IntervalService
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using PARR.Core.Common;
|
||||
using PARR.Core.Common.RabbitServices;
|
||||
using PARR.Infrastructure.Interval;
|
||||
using PARR.Infrastructure.Rabbit;
|
||||
|
||||
namespace PARR.Infrastructure
|
||||
@@ -20,6 +22,7 @@ namespace PARR.Infrastructure
|
||||
services.AddHttpClient<IRabbitAdminService, RabbitAdminService>();
|
||||
services.AddTransient<IRabbitService, RabbitService>();
|
||||
|
||||
services.AddTransient<IIntervalService, IntervalService>();
|
||||
|
||||
//services.AddTransient<IEmailService, EmailService>();
|
||||
//services.AddTransient<IRabbitService, RabbitService>();
|
||||
|
||||
58
PARR.Infrastructure/Interval/IntervalService.cs
Normal file
58
PARR.Infrastructure/Interval/IntervalService.cs
Normal file
@@ -0,0 +1,58 @@
|
||||
using Microsoft.Extensions.Logging;
|
||||
using PARR.Core.Common;
|
||||
|
||||
namespace PARR.Infrastructure.Interval
|
||||
{
|
||||
internal class IntervalService : IIntervalService
|
||||
{
|
||||
private readonly ILogger<IntervalService> logger;
|
||||
|
||||
public IntervalService(ILogger<IntervalService> logger)
|
||||
{
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
//public async Task IntervalInitAsync(IntervalHandlerDelegate intervalHandler, TimeSpan interval)
|
||||
public async Task IntervalInitAsync(Func<Task> handler, TimeSpan interval)
|
||||
{
|
||||
logger.LogInformation("Инициализация интервального сервиса с интервалом: {Interval}", interval);
|
||||
|
||||
var nextStart = DateTimeOffset.UtcNow;
|
||||
|
||||
while (true)
|
||||
{
|
||||
nextStart = DateTimeOffset.UtcNow;
|
||||
|
||||
logger.LogInformation("Запуск по расписанию. Интервал: {interval}, дата: {nextStart}", interval, nextStart);
|
||||
|
||||
try
|
||||
{
|
||||
await handler.Invoke();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
logger.LogError(ex, "Ошибка при выполнении интервального обработчика");
|
||||
}
|
||||
|
||||
nextStart = nextStart.Add(interval);
|
||||
|
||||
logger.LogInformation("Следующая дата запуска: {NextStart}. Интервал: {Interval}.", nextStart, interval);
|
||||
|
||||
var intervalOffset = nextStart - DateTimeOffset.UtcNow;
|
||||
if (intervalOffset < TimeSpan.Zero)
|
||||
{
|
||||
intervalOffset = TimeSpan.Zero;
|
||||
logger.LogWarning(
|
||||
"Время следующего запуска изменено на текущее время. Рассчитанное время запуска ({NextStart}) меньше текущего времени ({Now}). " +
|
||||
"Это произошло потому что время выполнения основного метода больше чем заданный интервал повторений.",
|
||||
nextStart,
|
||||
DateTimeOffset.UtcNow);
|
||||
}
|
||||
|
||||
logger.LogDebug("Ожидание {Delay} перед следующим запуском", intervalOffset);
|
||||
|
||||
await Task.Delay(intervalOffset);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user