namespace ZB.MOM.WW.ScadaBridge.StoreAndForward; /// /// Configuration options for the Store-and-Forward Engine. /// public class StoreAndForwardOptions { /// /// Path to the legacy standalone store-and-forward SQLite file. Migration-only. /// The buffer itself lives in the consolidated LocalDb database (LocalDb:Path) /// as of LocalDb Phase 2; this path is read once at boot by /// SiteLocalDbLegacyMigrator to drain a pre-Phase-2 file, and is otherwise /// unused. A node that has already migrated may leave it set or unset. /// public string SqliteDbPath { get; set; } = "./data/store-and-forward.db"; /// Default retry interval for messages without per-source settings. public TimeSpan DefaultRetryInterval { get; set; } = TimeSpan.FromSeconds(30); /// /// Default maximum retry count before parking. Applied when an /// EnqueueAsync caller does not pass an explicit maxRetries. /// public int DefaultMaxRetries { get; set; } = 50; /// Interval for the background retry timer sweep. public TimeSpan RetryTimerInterval { get; set; } = TimeSpan.FromSeconds(10); /// /// Maximum due rows loaded per retry sweep. Bounds sweep memory and duration /// under backlog; the remainder is picked up on the next tick (10 s). /// 0 = unlimited (legacy). /// public int SweepBatchLimit { get; set; } = 500; /// /// Max (category, target) lanes delivered concurrently per sweep. /// 1 = legacy serial. Within a lane delivery stays sequential (per-target FIFO). /// public int SweepTargetParallelism { get; set; } = 4; /// /// WP2.6c (arch-review misc — unbounded S&F observer queue): capacity of the /// cached-call audit-observer pump's queue. It was the one unbounded /// Channel<T> left in the system — a slow/stuck /// ICachedCallLifecycleObserver (a SQLite audit write) could not stretch /// the retry sweep, but nothing stopped it growing without bound while the sweep kept /// posting. Bounded with /// — the same overflow policy as its sibling bounded channels /// (SiteEventLogger's write queue, the debug/alarm stream hubs) — so a stuck /// observer sheds the oldest unprocessed notifications instead of leaking memory; drops /// are counted (see StoreAndForwardService.ObserverQueueDroppedCount). /// public int ObserverQueueCapacity { get; set; } = 10_000; }