示例#1
0
 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();
         }
     }
 }
示例#2
0
        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;
                }
            }
        }