コード例 #1
0
ファイル: ModuleProcess.cs プロジェクト: ksaye/Industrial-IoT
        /// <summary>
        /// Run module host
        /// </summary>
        public async Task <int> RunAsync()
        {
            // Wait until the module unloads
            while (true)
            {
                using (var hostScope = ConfigureContainer(_config)) {
                    _reset = new TaskCompletionSource <bool>();
                    var             module           = hostScope.Resolve <IModuleHost>();
                    var             events           = hostScope.Resolve <IEventEmitter>();
                    var             workerSupervisor = hostScope.Resolve <IWorkerSupervisor>();
                    var             logger           = hostScope.Resolve <ILogger>();
                    var             moduleConfig     = hostScope.Resolve <IModuleConfig>();
                    var             identity         = hostScope.Resolve <IIdentity>();
                    ISessionManager sessionManager   = null;
                    var             server           = new MetricServer(port: kPublisherPrometheusPort);
                    try {
                        var version = GetType().Assembly.GetReleaseVersion().ToString();
                        logger.Information("Starting module OpcPublisher version {version}.", version);
                        logger.Information("Initiating prometheus at port {0}/metrics", kPublisherPrometheusPort);
                        server.StartWhenEnabled(moduleConfig, logger);
                        CheckDeprecatedParams(logger);
                        // Start module
                        await module.StartAsync(IdentityType.Publisher, SiteId,
                                                "OpcPublisher", version, this);

                        kPublisherModuleStart.WithLabels(
                            identity.DeviceId ?? "", identity.ModuleId ?? "").Inc();
                        await workerSupervisor.StartAsync();

                        sessionManager = hostScope.Resolve <ISessionManager>();
                        OnRunning?.Invoke(this, true);
                        await Task.WhenAny(_reset.Task, _exit.Task);

                        if (_exit.Task.IsCompleted)
                        {
                            logger.Information("Module exits...");
                            return(_exitCode);
                        }
                        _reset = new TaskCompletionSource <bool>();
                        logger.Information("Module reset...");
                    }
                    catch (Exception ex) {
                        logger.Error(ex, "Error during module execution - restarting!");
                    }
                    finally {
                        await workerSupervisor.StopAsync();

                        await sessionManager?.StopAsync();

                        await module.StopAsync();

                        OnRunning?.Invoke(this, false);
                        kPublisherModuleStart.WithLabels(
                            identity.DeviceId ?? "", identity.ModuleId ?? "").Set(0);
                        server.StopWhenEnabled(moduleConfig, logger);
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Run module host
        /// </summary>
        public async Task <int> RunAsync()
        {
            // Wait until the module unloads
            while (true)
            {
                using (var hostScope = ConfigureContainer(_config)) {
                    _reset = new TaskCompletionSource <bool>();
                    var module           = hostScope.Resolve <IModuleHost>();
                    var events           = hostScope.Resolve <IEventEmitter>();
                    var workerSupervisor = hostScope.Resolve <IWorkerSupervisor>();
                    var logger           = hostScope.Resolve <ILogger>();
                    var config           = new Config(_config);
                    logger.Information("Initiating prometheus at port {0}/metrics", kPublisherPrometheusPort);
                    var server = new MetricServer(port: kPublisherPrometheusPort);
                    try {
                        server.StartWhenEnabled(config, logger);
                        var product = "OpcPublisher_" +
                                      GetType().Assembly.GetReleaseVersion().ToString();
                        kPublisherModuleStart.Inc();
                        // Start module
                        await module.StartAsync(IdentityType.Publisher, SiteId,
                                                product, this);

                        await workerSupervisor.StartAsync();

                        OnRunning?.Invoke(this, true);
                        await Task.WhenAny(_reset.Task, _exit.Task);

                        if (_exit.Task.IsCompleted)
                        {
                            logger.Information("Module exits...");
                            return(_exitCode);
                        }

                        _reset = new TaskCompletionSource <bool>();
                        logger.Information("Module reset...");
                    }
                    catch (Exception ex) {
                        logger.Error(ex, "Error during module execution - restarting!");
                    }
                    finally {
                        await workerSupervisor.StopAsync();

                        await module.StopAsync();

                        kPublisherModuleStart.Set(0);
                        server.Stop();
                        OnRunning?.Invoke(this, false);
                    }
                }
            }
        }
コード例 #3
0
        /// <summary>
        /// Run module host
        /// </summary>
        public async Task <int> RunAsync()
        {
            // Wait until the module unloads
            while (true)
            {
                using (var hostScope = ConfigureContainer(_config)) {
                    _reset = new TaskCompletionSource <bool>();
                    var             module             = hostScope.Resolve <IModuleHost>();
                    var             events             = hostScope.Resolve <IEventEmitter>();
                    var             workerSupervisor   = hostScope.Resolve <IWorkerSupervisor>();
                    var             logger             = hostScope.Resolve <ILogger>();
                    var             moduleConfig       = hostScope.Resolve <IModuleConfig>();
                    var             identity           = hostScope.Resolve <IIdentity>();
                    var             healthCheckManager = hostScope.Resolve <IHealthCheckManager>();
                    ISessionManager sessionManager     = null;
                    var             server             = new MetricServer(port: kPublisherPrometheusPort);

                    try {
                        var version = GetType().Assembly.GetReleaseVersion().ToString();
                        logger.Information("Starting module OpcPublisher version {version}.", version);
                        logger.Information("Initiating prometheus at port {0}/metrics", kPublisherPrometheusPort);
                        server.StartWhenEnabled(moduleConfig, logger);
                        healthCheckManager.Start();

                        // Start module
                        await module.StartAsync(IdentityType.Publisher, SiteId,
                                                "OpcPublisher", version, this).ConfigureAwait(false);

                        kPublisherModuleStart.WithLabels(
                            identity.DeviceId ?? "", identity.ModuleId ?? "").Inc();
                        await workerSupervisor.StartAsync().ConfigureAwait(false);

                        // Reporting runtime state on restart.
                        // Reporting will happen only in stadalone mode.
                        if (RunInStandaloneMode)
                        {
                            var runtimeStateReporter = hostScope.Resolve <IRuntimeStateReporter>();
                            // Needs to be called only after module.StartAsync() so that IClient is initialized.
                            await runtimeStateReporter.SendRestartAnnouncement().ConfigureAwait(false);
                        }

                        sessionManager = hostScope.Resolve <ISessionManager>();
                        OnRunning?.Invoke(this, true);
                        await Task.WhenAny(_reset.Task, _exit.Task).ConfigureAwait(false);

                        if (_exit.Task.IsCompleted)
                        {
                            logger.Information("Module exits...");
                            return(_exitCode);
                        }
                        _reset = new TaskCompletionSource <bool>();
                        logger.Information("Module reset...");
                    }
                    catch (Exception ex) {
                        logger.Error(ex, "Error during module execution - restarting!");
                    }
                    finally {
                        OnRunning?.Invoke(this, false);
                        await workerSupervisor.StopAsync().ConfigureAwait(false);

                        await(sessionManager?.StopAsync() ?? Task.CompletedTask).ConfigureAwait(false);
                        kPublisherModuleStart.WithLabels(
                            identity.DeviceId ?? "", identity.ModuleId ?? "").Set(0);
                        healthCheckManager.Stop();
                        server.StopWhenEnabled(moduleConfig, logger);
                        await module.StopAsync().ConfigureAwait(false);

                        logger.Information("Module stopped.");
                    }
                }
            }
        }