Exemplo n.º 1
0
 public SceneActor(SceneConfig sceneConfig, KnownPaths knownPaths)
 {
     foreach (var sceneAction in sceneConfig.Actions)
     {
         Context.ActorOf(ActionActor.Props(sceneAction, knownPaths), $"{sceneAction.Name}-{Salt.Gen()}");
     }
 }
Exemplo n.º 2
0
        public ActionActor(SceneConfig.SceneAction sceneAction, KnownPaths knownPaths)
        {
            _knownPaths  = knownPaths;
            _sceneAction = sceneAction;

            BecomeIdle();
        }
Exemplo n.º 3
0
        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);
            });
        }
Exemplo n.º 4
0
        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);
            }
        }
Exemplo n.º 5
0
 public static Props Props(SceneConfig sceneConfig, KnownPaths knownPaths)
 {
     return(Akka.Actor.Props.Create(() => new SceneActor(sceneConfig, knownPaths)));
 }