using StackExchange.Redis; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; namespace IOB_UT_NEXT { /// /// Classe gestione code, a seconda della conf come LIST redis o come concurrent queue in memoria /// public class DataQueue : IDisposable { #region Public Fields public long Count { get; set; } = 0; #endregion Public Fields #region Public Constructors public DataQueue(string codIOB, string qName, bool useRedis, RedisIobCache redisCacheMan) { UseRedis = useRedis; CodIOB = codIOB; QueueName = qName; if (UseRedis) { redisMan = redisCacheMan; KeyName = redisMan.redHash($"IOB:QUEUE:{CodIOB}:{QueueName}"); } } #endregion Public Constructors #region Public Methods public void Dispose() { redisMan = null; KeyName = ""; } /// /// Accodamento elemento /// /// public void Enqueue(string item) { if (UseRedis) { Count = redisMan.redQueuePush(KeyName, item); } else { MemQueue.Enqueue(item); Count = MemQueue.Count; } } /// /// Lista string degli elementi in coda, svuotando la coda /// /// public List ToList() { List answ = new List(); if (UseRedis) { // recupero in blocco... answ = redisMan.redQueuePopAll(KeyName) .Select(x => $"{x}") .ToList(); } else { answ = MemQueue.ToList(); Count = MemQueue.Count; } return answ; } /// /// Recupera 1 record dalla coda... /// /// /// public bool TryDequeue(out string result) { bool fatto = false; if (UseRedis) { result = redisMan.redQueuePop(KeyName); Count = (int)redisMan.redQueueCount(KeyName); fatto = true; } else { fatto = MemQueue.TryDequeue(out result); Count = MemQueue.Count; } return fatto; } #endregion Public Methods #region Private Fields private string CodIOB = "NA"; private RedisKey KeyName = "NA"; /// /// Coda modalità memoria locale /// private ConcurrentQueue MemQueue = new ConcurrentQueue(); private string QueueName = "NA"; /// /// Oggetto connessione REDIS /// private RedisIobCache redisMan; /// /// Indica se usare redis come datastore vs memoria /// private bool UseRedis = false; #endregion Private Fields } }