MdpOutboundGate.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using Microsoft.Extensions.Logging;
  2. using Microsoft.Extensions.Options;
  3. namespace Admin.NET.Plugin.AiDOP.DataPlatform.Executors;
  4. /// <summary>
  5. /// 出站总闸门。三个推送入口(事件驱动 Worker、60 秒 Job、手工重投)
  6. /// 以及领料单号同步都汇到这里;关闭时不发送、不改 <c>mdp_outbox</c> 状态、不烧重试。
  7. /// </summary>
  8. public sealed class MdpOutboundGate : ISingleton
  9. {
  10. public const string DisabledMessage = "出站推送已关闭,mdp_outbox 只入队不发送";
  11. private readonly IOptionsMonitor<AidopOutboundOptions> _options;
  12. private readonly ILogger _logger;
  13. private int _announced;
  14. private long _refused;
  15. public MdpOutboundGate(IOptionsMonitor<AidopOutboundOptions> options, ILoggerFactory loggerFactory)
  16. {
  17. _options = options;
  18. _logger = loggerFactory.CreateLogger(nameof(MdpOutboundGate));
  19. }
  20. public bool IsEnabled => _options.CurrentValue.Enabled;
  21. public long RefusedCount => Interlocked.Read(ref _refused);
  22. /// <summary>进程内只打一次。由启动即跑的出站 Job 调用,保证关着的时候日志里能看见。</summary>
  23. public void AnnounceIfDisabled()
  24. {
  25. if (IsEnabled || Interlocked.Exchange(ref _announced, 1) == 1)
  26. return;
  27. _logger.LogWarning("[MdpOutboundGate] {Message}", DisabledMessage);
  28. }
  29. /// <summary>关闭时返回 <see cref="MdpPushResult.Hold"/> 的结果;调用方不得据此改 outbox 行。</summary>
  30. public MdpPushResult? TryHold()
  31. {
  32. if (IsEnabled)
  33. return null;
  34. AnnounceIfDisabled();
  35. var n = Interlocked.Increment(ref _refused);
  36. if (n == 1 || n % 100 == 0)
  37. _logger.LogWarning("[MdpOutboundGate] {Message};已拦截 {Count} 次", DisabledMessage, n);
  38. return MdpPushResult.Hold(DisabledMessage);
  39. }
  40. }