using Hangfire; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using TrackCenter.Application.Hangfire; using TrackCenter.Application.Helpers; using TrackCenter.Application.Options; namespace TrackCenter.Application.HostServices; /// /// 预警任务组件初始化 /// tips:支持定时任务执行周期配置 动态更新并应用 √ /// public class WarningTaskComponentHostedService : IHostedService { private readonly IOptionsMonitor _optionsMonitor; private TrackWarningTaskOptions? _oldOptions; private readonly ILogger _logger; private readonly IRecurringJobManager _recurringJobManager; public WarningTaskComponentHostedService( IOptionsMonitor optionsMonitor, ILogger logger, IRecurringJobManager recurringJobManager) { _optionsMonitor = optionsMonitor; _logger = logger; _recurringJobManager = recurringJobManager; // 防抖配置变更包装 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}h,回传重试推送任务扫描周期{b}min", newVal.ScanWarningNotifyTaskHourInterval, newVal.ScanReturnWarningRetryPushTaskMinuteInterval); if ((_oldOptions?.ScanWarningNotifyTaskHourInterval ?? 0) != newVal.ScanWarningNotifyTaskHourInterval) { var q = GlobalConst.TaskQueueLevelDict[_optionsMonitor.CurrentValue.ScanWarningNotifyTaskLevel]; // 预警通知任务扫描 _recurringJobManager.AddOrUpdate("Scan_WarningNotifyTask", q, x => x.ScanNotifyTaskAndSchedulingAsync(), $"0 */{newVal.ScanWarningNotifyTaskHourInterval} * * *"); } if ((_oldOptions?.ScanReturnWarningRetryPushTaskMinuteInterval ?? 0) != newVal.ScanReturnWarningRetryPushTaskMinuteInterval) { var q = GlobalConst.TaskQueueLevelDict[_optionsMonitor.CurrentValue.ScanReturnWarningRetryPushTaskLevel]; // 回传预警通知重试推送任务扫描 _recurringJobManager.AddOrUpdate("Scan_ReturnWarningRetryPushTask", q, x => x.ScanReturnRetryPushTaskAndSchedulingAsync(), $"*/{newVal.ScanReturnWarningRetryPushTaskMinuteInterval} * * * *"); } // 移除历史运输预警明细生成任务扫描(若仍挂在 Hangfire 上) _recurringJobManager.RemoveIfExists("Scan_TransportWarningDetailsGenerateTask"); _oldOptions = newVal; } }