public SceneActor(SceneConfig sceneConfig, KnownPaths knownPaths) { foreach (var sceneAction in sceneConfig.Actions) { Context.ActorOf(ActionActor.Props(sceneAction, knownPaths), $"{sceneAction.Name}-{Salt.Gen()}"); } }
public ActionActor(SceneConfig.SceneAction sceneAction, KnownPaths knownPaths) { _knownPaths = knownPaths; _sceneAction = sceneAction; BecomeIdle(); }
public SceneCreatorActor(KnownPaths knownPaths) { //upsert Receive <CreateScene>(e => { //stop prev version if exists var old = Context.System.ActorSelection($"/user/$a/$a/{e.SceneConfig.Name}-*"); old.Tell(PoisonPill.Instance); //start new Context.ActorOf(SceneActor.Props(e.SceneConfig, knownPaths), $"{e.SceneConfig.Name}-{Salt.Gen()}"); }); //delete Receive <RemoveScene>(e => { //stop prev version if exists var old = Context.System.ActorSelection($"/user/$a/$a/{e.SceneConfig.Name}-*"); old.Tell(PoisonPill.Instance); }); }
public static async Task Start(CancellationToken cancellationToken) { try { #region Configuration var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables(); var config = builder.Build(); var cfgYaml = config.GetSection(nameof(SceneYamlConfig)).Get <SceneYamlConfig>(); var cfgMqtt = config.GetSection(nameof(MqttConfig)).Get <MqttConfig>(); #endregion #region infrastructure _actorSystem = InitActorSystem(config); _fileProvider = await InitYamlFileProvider(cfgYaml, cancellationToken); #endregion #region services // ReSharper disable RedundantTypeArgumentsOfMethod var services = new ServiceCollection(); #region log services.AddLogging(logging => { logging.AddConfiguration(config.GetSection("Logging")); logging.AddConsole(); }); #endregion #region yaml services.AddSingleton <ISceneProvider, YamlSceneProvider>(); services.AddSingleton <Deserializer>(new DeserializerBuilder() .WithNamingConvention(new CamelCaseNamingConvention()) .Build()); services.AddSingleton <IFileProvider>(_fileProvider); #endregion #region mqtt services.AddSingleton <IManagedMqttClient>(sp => { _mqtt = InitMqtt(cfgMqtt).GetAwaiter().GetResult(); return(_mqtt); }); services.AddTransient <IMqttBasicClient, MqttNetAdapter>(); #endregion #region quartz services.Scan(scan => scan.FromAssembliesOf(typeof(TellScheduleJob)) .AddClasses(x => x.AssignableTo <IJob>()) .AsSelf() .WithTransientLifetime()); services.AddSingleton <ISceneActionScheduler>(sp => { _quartzScheduler = InitQuartz(sp).GetAwaiter().GetResult(); return(new QuartzActionScheduler(_quartzScheduler, sp.GetService <ILogger <QuartzActionScheduler> >())); }); #endregion #region akka services.AddSingleton <ActorSystem>(_actorSystem); services.Scan(scan => scan.FromAssembliesOf(typeof(SceneCreatorActor)) .AddClasses(x => x.AssignableTo <ReceiveActor>()) .AsSelf() .WithScopedLifetime()); services.AddSingleton(new KnownPaths()); #endregion var serviceProvider = services.BuildServiceProvider(); // ReSharper restore RedundantTypeArgumentsOfMethod #endregion InitActorSystemDI(_actorSystem, serviceProvider); _actorConfigReader = _actorSystem.ActorOf(_actorSystem.DI().Props <SceneConfigReaderActor>()); _actorPubSub = _actorSystem.ActorOf(_actorSystem.DI().Props <PubSubProxyActor>()); //initial read _actorConfigReader.Tell(new SceneConfigReaderActor.ReadScenes()); _knownPaths = serviceProvider.GetRequiredService <KnownPaths>(); _knownPaths.PubSubActorPath = _actorPubSub.Path; _logger = serviceProvider.GetService <ILogger <Program> >(); _logger.LogInformation("Scene Processor Start"); } catch (Exception ex) { Console.WriteLine(ex); } }
public static Props Props(SceneConfig sceneConfig, KnownPaths knownPaths) { return(Akka.Actor.Props.Create(() => new SceneActor(sceneConfig, knownPaths))); }