using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Oms.Application.Messaging; namespace Oms.Application.Workers; /// /// 轮询已提交的创单后置步骤。进程在事务提交后、步骤执行前退出时,靠这里补跑。 /// public sealed class OrderSideEffectWorker( IServiceScopeFactory scopeFactory, ILogger logger) : BackgroundService { private static readonly TimeSpan PollInterval = TimeSpan.FromSeconds(2); protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { await OrderSideEffectExecutor.RecoverStuckForecastAsync(scopeFactory, logger, stoppingToken); await OrderSideEffectExecutor.ProcessDueAsync(scopeFactory, logger, stoppingToken); } catch (Exception ex) when (ex is not OperationCanceledException) { logger.LogError(ex, "创单后置步骤轮询失败"); } try { await Task.Delay(PollInterval, stoppingToken); } catch (OperationCanceledException) { break; } } } }