/// <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); } } } }
/// <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 logger = hostScope.Resolve <ILogger>(); var config = new Config(_config); logger.Information("Initiating prometheus at port {0}/metrics", kDiscoveryPrometheusPort); var server = new MetricServer(port: kDiscoveryPrometheusPort); try { server.StartWhenEnabled(config, logger); // Start module var product = "OpcDiscovery_" + GetType().Assembly.GetReleaseVersion().ToString(); kDiscoveryModuleStart.Inc(); await module.StartAsync(IdentityType.Discoverer, SiteId, product, this); 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 module.StopAsync(); kDiscoveryModuleStart.Set(0); server.StopWhenEnabled(config, logger); OnRunning?.Invoke(this, false); } } } }
/// <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."); } } } }