All checks were successful
Build and Deploy / deploy (push) Successful in 1m0s
进程重启或事务回滚不再丢掉 9610、轨迹和揽收;排货完成后再补轨迹、面单和计费相关触发。 Co-authored-by: Cursor <cursoragent@cursor.com>
42 lines
1.3 KiB
C#
42 lines
1.3 KiB
C#
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Logging;
|
|
using Oms.Application.Messaging;
|
|
|
|
namespace Oms.Application.Workers;
|
|
|
|
/// <summary>
|
|
/// 轮询已提交的创单后置步骤。进程在事务提交后、步骤执行前退出时,靠这里补跑。
|
|
/// </summary>
|
|
public sealed class OrderSideEffectWorker(
|
|
IServiceScopeFactory scopeFactory,
|
|
ILogger<OrderSideEffectWorker> 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;
|
|
}
|
|
}
|
|
}
|
|
}
|