diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteAlarmAggregatorActor.cs b/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteAlarmAggregatorActor.cs index 22ef5b05..a8007097 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteAlarmAggregatorActor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteAlarmAggregatorActor.cs @@ -568,7 +568,9 @@ public sealed class SiteAlarmAggregatorActor : ReceiveActor, IWithTimers // A down stream is reopened in preference to fanning out: the reopen's connect // callback seeds by itself, so doing both would double the work. var reopening = false; - if (_streamDown && !_openInFlight) + // Not while a backoff reconnect is already scheduled: the tick used to open a stream + // and the pending ReconnectAlarmStream then opened a second one (a double subscribe). + if (_streamDown && !_openInFlight && !Timers.IsTimerActive(ReconnectTimerKey)) { _log.Info("Site-alarm gRPC stream for {0} was down; reopening on reconcile tick", _siteIdentifier); if (_retryBudgetExhausted)