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 _optionsMonitor; private TrackAppOptions? _oldOptions; private readonly ILogger _logger; public TrackTaskComponentHostedService(IOptionsMonitor optionsMonitor, ILogger 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 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("Execute_TrackPullTask", q, x => x.RefreshForTaskAsync(), $"*/{newVal.TrackPullTaskMinuteInterval} * * * *"); } _oldOptions = newVal; } }