Phase 3C: Deployment pipeline & Store-and-Forward engine
Deployment Manager (WP-1–8, WP-16): - DeploymentService: full pipeline (flatten→validate→send→track→audit) - OperationLockManager: per-instance concurrency control - StateTransitionValidator: Enabled/Disabled/NotDeployed transition matrix - ArtifactDeploymentService: broadcast to all sites with per-site results - Deployment identity (GUID + revision hash), idempotency, staleness detection - Instance lifecycle commands (disable/enable/delete) with deduplication Store-and-Forward (WP-9–15): - StoreAndForwardStorage: SQLite persistence, 3 categories, no max buffer - StoreAndForwardService: fixed-interval retry, transient-only buffering, parking - ReplicationService: async best-effort to standby (fire-and-forget) - Parked message management (query/retry/discard from central) - Messages survive instance deletion, S&F drains on disable 620 tests pass (+79 new), zero warnings.
This commit is contained in:
49
src/ScadaLink.StoreAndForward/StoreAndForwardMessage.cs
Normal file
49
src/ScadaLink.StoreAndForward/StoreAndForwardMessage.cs
Normal file
@@ -0,0 +1,49 @@
|
||||
using ScadaLink.Commons.Types.Enums;
|
||||
|
||||
namespace ScadaLink.StoreAndForward;
|
||||
|
||||
/// <summary>
|
||||
/// WP-9: Represents a single store-and-forward message as stored in SQLite.
|
||||
/// Maps to the sf_messages table.
|
||||
/// </summary>
|
||||
public class StoreAndForwardMessage
|
||||
{
|
||||
/// <summary>Unique message ID (GUID).</summary>
|
||||
public string Id { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>WP-9: Category: ExternalSystem, Notification, or CachedDbWrite.</summary>
|
||||
public StoreAndForwardCategory Category { get; set; }
|
||||
|
||||
/// <summary>Target system name (external system, notification list, or DB connection).</summary>
|
||||
public string Target { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>JSON-serialized payload containing the call details.</summary>
|
||||
public string PayloadJson { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>Number of delivery attempts so far.</summary>
|
||||
public int RetryCount { get; set; }
|
||||
|
||||
/// <summary>Maximum retry attempts before parking (0 = no limit).</summary>
|
||||
public int MaxRetries { get; set; }
|
||||
|
||||
/// <summary>Retry interval in milliseconds.</summary>
|
||||
public long RetryIntervalMs { get; set; }
|
||||
|
||||
/// <summary>When this message was first enqueued.</summary>
|
||||
public DateTimeOffset CreatedAt { get; set; }
|
||||
|
||||
/// <summary>When delivery was last attempted (null if never attempted).</summary>
|
||||
public DateTimeOffset? LastAttemptAt { get; set; }
|
||||
|
||||
/// <summary>Current status of the message.</summary>
|
||||
public StoreAndForwardMessageStatus Status { get; set; }
|
||||
|
||||
/// <summary>Last error message from a failed delivery attempt.</summary>
|
||||
public string? LastError { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Instance that originated this message (for S&F-survives-delete behavior).
|
||||
/// WP-13: Messages are NOT cleared when instance is deleted.
|
||||
/// </summary>
|
||||
public string? OriginInstanceName { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user