Creating an Assembly or Hcd Component
An Assembly or HCD is implemented by extending the ComponentHandlers
base class. These handlers are executed by an Akka Actor (Top Level Actor or TLA) defined in the framework which handles the lifecycle and supervision of this component.
class AssemblyComponentHandlers(ctx: ActorContext[TopLevelActorMessage], cswCtx: CswContext)
extends ComponentHandlers(ctx, cswCtx)
public class JAssemblyComponentHandlers extends JComponentHandlers {
private final ActorContext<TopLevelActorMessage> ctx;
private final ComponentInfo componentInfo;
private final CommandResponseManager commandResponseManager;
private final CurrentStatePublisher currentStatePublisher;
private final ILocationService locationService;
private final IEventService eventService;
private ILogger log;
private IConfigClientService configClient;
private Map<Connection, Optional<ICommandService>> runningHcds;
private ActorRef<DiagnosticPublisherMessages> diagnosticPublisher;
private ActorRef<CommandResponse.SubmitResponse> commandResponseAdapter;
public JAssemblyComponentHandlers(akka.actor.typed.javadsl.ActorContext<TopLevelActorMessage> ctx, JCswContext cswCtx) {
super(ctx, cswCtx);
this.ctx = ctx;
this.componentInfo = cswCtx.componentInfo();
this.commandResponseManager = cswCtx.commandResponseManager();
this.currentStatePublisher = cswCtx.currentStatePublisher();
this.locationService = cswCtx.locationService();
this.eventService = cswCtx.eventService();
log = cswCtx.loggerFactory().getLogger(this.getClass());
configClient = JConfigClientFactory.clientApi(Adapter.toUntyped(ctx.getSystem()), locationService);
runningHcds = new HashMap<>();
commandResponseAdapter = TestProbe.<CommandResponse.SubmitResponse>create(ctx.getSystem()).ref();
commandResponseAdapter = TestProbe.<CommandResponse.SubmitResponse>create(ctx.getSystem()).ref();
}
class HcdComponentHandlers(ctx: ActorContext[TopLevelActorMessage], cswCtx: CswContext)
extends ComponentHandlers(ctx, cswCtx)
public class JHcdComponentHandlers extends JComponentHandlers {
private final ActorContext<TopLevelActorMessage> ctx;
private final ComponentInfo componentInfo;
private final CommandResponseManager commandResponseManager;
private final CurrentStatePublisher currentStatePublisher;
private final ILocationService locationService;
private final IEventService eventService;
private ILogger log;
private IConfigClientService configClient;
private ConfigData hcdConfig;
private ActorRef<WorkerActorMsg> worker;
private int current;
private int stats;
public JHcdComponentHandlers(
akka.actor.typed.javadsl.ActorContext<TopLevelActorMessage> ctx,
JCswContext cswCtx
) {
super(ctx, cswCtx);
this.ctx = ctx;
this.componentInfo = cswCtx.componentInfo();
this.commandResponseManager = cswCtx.commandResponseManager();
this.currentStatePublisher = cswCtx.currentStatePublisher();
this.locationService = cswCtx.locationService();
this.eventService = cswCtx.eventService();
log = cswCtx.loggerFactory().getLogger(this.getClass());
}
Converting a typed actor system to an untyped actor system
The ctx
available to the component is of type akka.actor.typed.scaladsl.ActorContext
in Scala or akka.actor.typed.javadsl.ActorContext
in Java. This context can be used to get resources such as actor system which is also typed. In order to get the untyped version of an actor system or actor references, Akka has provided some implicit extension methods in Scala and static methods in Java which can be used by adding the following import:
import akka.actor.typed.scaladsl.adapter._
for Scala and, import akka.actor.typed.javadsl.Adapter.*
for Java
A component can be created by a factory which extends ComponentBehaviorFactory
base class and provides a definition of handlers
method to return the appropriate implementation of ComponentHandlers
.
class AssemblyComponentBehaviorFactory extends ComponentBehaviorFactory {
protected override def handlers(ctx: ActorContext[TopLevelActorMessage], cswCtx: CswContext): ComponentHandlers =
new AssemblyComponentHandlers(ctx, cswCtx)
}
public class JAssemblyComponentBehaviorFactory extends JComponentBehaviorFactory {
@Override
public JComponentHandlers jHandlers(ActorContext<TopLevelActorMessage> ctx, JCswContext cswCtx) {
return new JAssemblyComponentHandlers(ctx, cswCtx);
}
}
class HcdComponentBehaviorFactory extends ComponentBehaviorFactory {
protected override def handlers(ctx: ActorContext[TopLevelActorMessage], cswCtx: CswContext): ComponentHandlers =
new HcdComponentHandlers(ctx, cswCtx)
}
public class JHcdComponentBehaviorFactory extends JComponentBehaviorFactory {
@Override
public JComponentHandlers jHandlers(ActorContext<TopLevelActorMessage> ctx, JCswContext cswCtx) {
return new JHcdComponentHandlers(ctx, cswCtx);
}
}