| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- using Microsoft.Extensions.DependencyInjection;
- using Microsoft.Extensions.Hosting;
- using Microsoft.Extensions.Logging;
- namespace Admin.NET.Plugin.AiDOP.DataPlatform.HotWatch;
- /// <summary>热回读后台:默认每 5 秒一轮,Concurrent 由单实例循环保证不叠加。</summary>
- public sealed class MdpHotWatchWorker : BackgroundService
- {
- private static readonly TimeSpan Interval = TimeSpan.FromSeconds(5);
- private readonly IServiceScopeFactory _scopeFactory;
- private readonly ILogger _logger;
- public MdpHotWatchWorker(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
- {
- _scopeFactory = scopeFactory;
- _logger = loggerFactory.CreateLogger(nameof(MdpHotWatchWorker));
- }
- protected override async Task ExecuteAsync(CancellationToken stoppingToken)
- {
- // 启动稍延后,避免与应用引导抢资源
- try { await Task.Delay(TimeSpan.FromSeconds(15), stoppingToken); }
- catch (OperationCanceledException) { return; }
- // 非执行机直接退出整个轮询循环,而不是每轮空转——5 秒一拍的热回读是多实例下
- // 最密集的一条无效查询链路。配置在启动后不会变,求值一次即可。
- if (!AidopJobGate.ShouldRun(nameof(MdpHotWatchWorker), _logger)) return;
- while (!stoppingToken.IsCancellationRequested)
- {
- try
- {
- using var scope = _scopeFactory.CreateScope();
- var svc = scope.ServiceProvider.GetRequiredService<MdpHotWatchService>();
- var (polled, changed, terminated) = await svc.PollOnceAsync(100, stoppingToken);
- if (changed + terminated > 0)
- _logger.LogInformation(
- "[MdpHotWatchWorker] polled={Polled} changed={Changed} terminated={Terminated}",
- polled, changed, terminated);
- }
- catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
- {
- break;
- }
- catch (Exception ex)
- {
- _logger.LogWarning(ex, "[MdpHotWatchWorker] poll failed");
- }
- try { await Task.Delay(Interval, stoppingToken); }
- catch (OperationCanceledException) { break; }
- }
- }
- }
|