public void AddValue(T val, MqttMsgPublishEventArgs mqttMsgPublishEventArgs) { lock (this) { if (_onlyChanges && Equals(CurrentItem?.Value, val)) { return; } var now = DateTime.UtcNow; if (_minInterval != null) { var diff = now - (CurrentItem?.TimeUtc ?? DateTime.MinValue); if (diff < _minInterval) { return; } } CurrentItem = new SingleDataRow <T>(now, val); if (!mqttMsgPublishEventArgs.Retain) { QueuedItems.Add(CurrentItem); Flush(); } } }
public async void Flush() { if (!_isFlushing && QueuedItems.Any()) { try { _isFlushing = true; await DbClient.Measurement(Name).AppendAsync(QueuedItems, false); Logger.Debug($"{Name}: Wrote {QueuedItems.Count} items: {string.Join(", ", QueuedItems.Select(i => $"{i.TimeUtc}: {i.Value}" ))}"); QueuedItems.Clear(); } catch (Exception ex) { Logger.Warn($"Couldn't write data for item {Name}, now queued {QueuedItems.Count} items, Reason: {ex.Message}"); ItemsToFlush.AddItem(this); } finally { _isFlushing = false; } } }