using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Admin.NET.Plugin.AiDOP.DataPlatform.HotWatch;
/// 热回读后台:默认每 5 秒一轮,Concurrent 由单实例循环保证不叠加。
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; }
while (!stoppingToken.IsCancellationRequested)
{
try
{
using var scope = _scopeFactory.CreateScope();
var svc = scope.ServiceProvider.GetRequiredService();
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; }
}
}
}