private <C extends AbstractConciergeConfigReader> ConciergeRootActor(final C configReader, final ActorRef pubSubMediator, final AbstractEnforcerActorFactory<C> authorizationProxyPropsFactory, final ActorMaterializer materializer) { requireNonNull(configReader); requireNonNull(pubSubMediator); requireNonNull(authorizationProxyPropsFactory); requireNonNull(materializer); final ActorContext context = getContext(); final ActorRef conciergeShardRegion = authorizationProxyPropsFactory.startEnforcerActor(context, configReader, pubSubMediator); retrieveStatisticsDetailsResponseSupplier = RetrieveStatisticsDetailsResponseSupplier.of(conciergeShardRegion, ConciergeMessagingConstants.SHARD_REGION, log); final ActorRef conciergeForwarder = startChildActor(context, ConciergeForwarderActor.ACTOR_NAME, ConciergeForwarderActor.props(pubSubMediator, conciergeShardRegion)); pubSubMediator.tell(new DistributedPubSubMediator.Put(getSelf()), getSelf()); pubSubMediator.tell(new DistributedPubSubMediator.Put(conciergeForwarder), getSelf()); startClusterSingletonActor(context, BatchSupervisorActor.ACTOR_NAME, BatchSupervisorActor.props(pubSubMediator, conciergeForwarder)); final ActorRef healthCheckingActor = startHealthCheckingActor(context, configReader); final HttpConfigReader httpConfig = configReader.http(); bindHttpStatusRoute(healthCheckingActor, httpConfig, materializer); }