diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs
index eee3a095..17a43f9d 100644
--- a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs
+++ b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/DriverHostActor.cs
@@ -1157,8 +1157,9 @@ public sealed class DriverHostActor : ReceiveActor, IWithTimers, IWithUnboundedS
/// null and ApplyScriptedAlarms becomes a no-op. The engine is built around a fresh
/// + the wired (the
/// replicated LocalDbAlarmConditionStateStore on a driver-role node); when no store was
- /// wired the host is skipped. The host (spawned as a child) owns + disposes the engine in its
- /// PostStop, so it stops with the driver host.
+ /// wired the host is skipped. The host is spawned through the factory Props, so EACH
+ /// incarnation (a supervision restart included) builds, owns and disposes its own engine; it stops
+ /// with the driver host.
///
private void SpawnScriptedAlarmHost()
{
@@ -1189,14 +1190,23 @@ public sealed class DriverHostActor : ReceiveActor, IWithTimers, IWithUnboundedS
return;
}
+ // Factory Props: every incarnation of the host (a supervision restart included) builds and owns a fresh
+ // (upstream, engine) pair, so a restart never reuses an engine the previous incarnation disposed or left
+ // half-loaded. The closure captures locals only; it runs in the child's constructor.
var store = _alarmStateStore;
- var upstream = new DependencyMuxTagUpstreamSource();
- var engine = new ScriptedAlarmEngine(
- upstream, store, new ScriptLoggerFactory(_scriptRootLogger.Logger), _scriptRootLogger.Logger,
- scripting: _scripting);
+ var scriptLogger = _scriptRootLogger.Logger;
+ var scripting = _scripting;
_scriptedAlarmHost = Context.ActorOf(
ScriptedAlarmHostActor.Props(
- _opcUaPublishActor, _dependencyMux, upstream, engine, _localNode, telemetryHub: _telemetryHub),
+ _opcUaPublishActor, _dependencyMux,
+ () =>
+ {
+ var upstream = new DependencyMuxTagUpstreamSource();
+ var engine = new ScriptedAlarmEngine(
+ upstream, store, new ScriptLoggerFactory(scriptLogger), scriptLogger, scripting: scripting);
+ return (upstream, engine);
+ },
+ _localNode, telemetryHub: _telemetryHub),
"scripted-alarm-host");
}