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
}
}