protected override async Task ExecuteAsync(CancellationToken stoppingToken) { if (!_config.DataBrokerEnabled) { return; } _logger.LogInformation("Started"); _logger.LogInformation($"Cloud publishing enabled: {_config.CloudPublishConfiguration.Enabled}"); var options = new ManagedMqttClientOptionsBuilder() .WithAutoReconnectDelay(TimeSpan.FromSeconds(5)) .WithClientOptions(new MqttClientOptionsBuilder() .WithClientId(GetType().Name) .WithTcpServer(_config.MqttServerAddress) .Build()) .Build(); await _mqttClient.SubscribeAsync("sensordevicetype/#"); await _mqttClient.SubscribeAsync("sensordevice/#"); await _mqttClient.SubscribeAsync("measurement/#"); _mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MqttMessageReceived); await _mqttClient.StartAsync(options); var minuteCounter = 0; int consecutiveReadFailCount = 0; while (!stoppingToken.IsCancellationRequested) { try { if (_config.CloudPublishConfiguration.Enabled) { if (minuteCounter % _config.CloudPublishConfiguration.UpdateIntervalMinutes == 0) { await _dataBroker.PublishCurrentData(); } if (minuteCounter % _config.CloudPublishConfiguration.HistoryUpdateIntervalMinutes == 0) { await _dataBroker.PublishHistoryData(); } if (minuteCounter % HistoryDatabaseCleanupIntervalMinutes == 0) { await _dataBroker.DeleteOldHistoryData(); } } await _dataBroker.SendAlerts(); consecutiveReadFailCount = 0; await Task.Delay(TimeSpan.FromSeconds(LoopInterval), stoppingToken); minuteCounter++; } catch (TaskCanceledException) { _logger.LogInformation("Stopped"); break; } catch (Exception ex) { _logger.LogError($"{DateTime.Now}: Error occured in Vahti.DataBroker: {ex.Message}, {ex.StackTrace}"); consecutiveReadFailCount++; // Break from loop if the problem persists if (consecutiveReadFailCount >= MaxRepeatedFailCount) { break; } continue; } } }