track/src/TrackCenter.Application/HostServices/TrackTaskComponentHostedService.cs

55 lines
1.9 KiB
C#

using Hangfire;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using TrackCenter.Application.Helpers;
using TrackCenter.Application.Options;
using TrackCenter.Application.Services.TimerTaskss;
namespace TrackCenter.Application.HostServices;
public class TrackTaskComponentHostedService : IHostedService
{
private readonly IOptionsMonitor<TrackAppOptions> _optionsMonitor;
private TrackAppOptions? _oldOptions;
private readonly ILogger<TrackTaskComponentHostedService> _logger;
public TrackTaskComponentHostedService(IOptionsMonitor<TrackAppOptions> optionsMonitor, ILogger<TrackTaskComponentHostedService> logger)
{
_optionsMonitor = optionsMonitor;
_logger = logger;
var onChanged = DebounceHelper.WrapMethod(TimeSpan.FromSeconds(1), () => { ReloadConfig(optionsMonitor); });
optionsMonitor.OnChange(_ => onChanged.Debounce());
}
public Task StartAsync(CancellationToken cancellationToken)
{
ReloadConfig(_optionsMonitor);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
private void ReloadConfig(IOptionsMonitor<TrackAppOptions> optionsMonitor)
{
var newVal = optionsMonitor.CurrentValue;
_logger.LogInformation("轨迹任务配置,轨迹刷新执行周期{a}min",
newVal.TrackPullTaskMinuteInterval
);
// 轨迹刷新任务
if ((_oldOptions?.TrackPullTaskMinuteInterval ?? 0) != newVal.TrackPullTaskMinuteInterval)
{
var q = GlobalConst.TaskQueueLevelDict[_optionsMonitor.CurrentValue.TrackPullTaskLevel];
RecurringJob.AddOrUpdate<TrackPullTask>("Execute_TrackPullTask",
q,
x => x.RefreshForTaskAsync(),
$"*/{newVal.TrackPullTaskMinuteInterval} * * * *");
}
_oldOptions = newVal;
}
}