Some checks failed
v2-ci / unit-tests (tests/Core/ZB.MOM.WW.OtOpcUa.Cluster.Tests) (push) Has been cancelled
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.ControlPlane.Tests) (push) Has been cancelled
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests) (push) Has been cancelled
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests) (push) Has been cancelled
v2-ci / unit-tests (tests/Server/ZB.MOM.WW.OtOpcUa.Security.Tests) (push) Has been cancelled
v2-ci / integration (push) Has been cancelled
v2-ci / build (push) Has been cancelled
New per-admin-node actor that subscribes to the fleet-status DistributedPubSub topic + forwards every FleetStatusChanged snapshot to all SignalR clients connected to FleetStatusHub via IHubContext. Wired via WithOtOpcUaSignalRBridges (new AkkaConfigurationBuilder extension in AdminUI.Hubs) — Program.cs calls it inside the if(hasAdmin) block alongside WithOtOpcUaControlPlaneSingletons. Per-node subscription rather than cluster-singleton: every admin node forwards its own snapshots to its own connected clients. Simpler than singleton coordination + acceptable because the messages are small and SignalR fan-out is per-node anyway.
40 lines
1.5 KiB
C#
40 lines
1.5 KiB
C#
using Akka.Actor;
|
|
using Akka.Hosting;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
namespace ZB.MOM.WW.OtOpcUa.AdminUI.Hubs;
|
|
|
|
public static class HubServiceCollectionExtensions
|
|
{
|
|
public const string FleetStatusSignalRBridgeName = "fleet-status-signalr-bridge";
|
|
|
|
/// <summary>
|
|
/// Spawns the SignalR bridge actors that forward DPS messages to browser-facing SignalR
|
|
/// hubs. Currently: <see cref="FleetStatusSignalRBridge"/> (DPS <c>fleet-status</c> topic →
|
|
/// <see cref="FleetStatusHub"/> clients).
|
|
///
|
|
/// Call inside the admin-role configurator on the shared <see cref="AkkaConfigurationBuilder"/>:
|
|
/// <code>
|
|
/// if (hasAdmin)
|
|
/// {
|
|
/// ab.WithOtOpcUaControlPlaneSingletons();
|
|
/// ab.WithOtOpcUaSignalRBridges();
|
|
/// }
|
|
/// </code>
|
|
/// </summary>
|
|
public static AkkaConfigurationBuilder WithOtOpcUaSignalRBridges(this AkkaConfigurationBuilder builder)
|
|
{
|
|
builder.WithActors((system, registry, resolver) =>
|
|
{
|
|
var hub = resolver.GetService<IHubContext<FleetStatusHub>>();
|
|
var actor = system.ActorOf(FleetStatusSignalRBridge.Props(hub), FleetStatusSignalRBridgeName);
|
|
registry.Register<FleetStatusSignalRBridgeKey>(actor);
|
|
});
|
|
return builder;
|
|
}
|
|
}
|
|
|
|
/// <summary>Marker key for <see cref="ActorRegistry"/> lookup of the SignalR bridge actor.</summary>
|
|
public sealed class FleetStatusSignalRBridgeKey { }
|