Files
SteamWare/SteamWareLib/MessagePipe.cs
T
2022-04-08 19:14:37 +02:00

153 lines
4.1 KiB
C#

using StackExchange.Redis;
using System;
namespace SteamWare
{
/// <summary>
/// Classe gestione PubSub messaggi REDIS
/// </summary>
public class MessagePipe
{
#region Private Fields
private bool enableLog = false;
private IConnectionMultiplexer redis;
private IDatabase redisDb;
#endregion Private Fields
#region Protected Fields
/// <summary>
/// Obj x gestione log
/// </summary>
protected static NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger();
#endregion Protected Fields
#region Public Constructors
/// <summary>
/// Init canale di comunicazione PubSub via REDIS
/// </summary>
/// <param name="channelName"></param>
/// <param name="enableLog"></param>
public MessagePipe(string channelName, bool enableLog = false)
{
_channel = channelName;
redis = memLayer.ML.connRedis;
redisDb = redis.GetDatabase();
this.enableLog = enableLog;
// aggiungo sottoscrittore
setupSubscriber();
}
#endregion Public Constructors
#region Public Events
/// <summary>
/// Messaggio veicolato dal canale
/// </summary>
public event EventHandler EA_NewMessage = delegate { };
#endregion Public Events
#region Private Properties
/// <summary>
/// Canale associato al gestore pipeline messaggi
/// </summary>
private string _channel { get; set; } = "";
#endregion Private Properties
#region Private Methods
private void setupSubscriber()
{
ISubscriber sub = redis.GetSubscriber();
//Subscribe to the channel named messages
sub.Subscribe(_channel, (channel, message) =>
{
Log.Trace($"ch {channel} | {message}");
// messaggio
PubSubEventArgs mea = new PubSubEventArgs(message);
// se qualcuno ascolta sollevo evento nuovo valore...
if (EA_NewMessage != null)
{
EA_NewMessage(this, mea);
}
});
Log.Info($"Subscribed {_channel}");
}
#endregion Private Methods
#region Public Methods
/// <summary>
/// Invio messaggio sul canale + salvataggio in cache REDIS
/// </summary>
/// <param name="memKey">Chiave REDIS x salvare valore</param>
/// <param name="message"></param>
public bool saveAndSendMessage(string memKey, string message)
{
bool answ = false;
// invio notifica tramite il canale richiesto
answ = sendMessage(message);
if (redisDb != null)
{
redisDb.StringSetAsync(memKey, message);
if (enableLog)
{
Log.Info($"Redis Cache Key: {memKey}");
}
}
return answ;
}
/// <summary>
/// Invio messaggio sul canale
/// </summary>
/// <param name="newMess"></param>
/// <returns></returns>
public bool sendMessage(string newMess)
{
bool answ = false;
ISubscriber sub = redis.GetSubscriber();
sub.Publish(_channel, newMess);
return answ;
}
#endregion Public Methods
}
/// <summary>
/// Evento messaggio PubSub Redis
/// </summary>
public class PubSubEventArgs : EventArgs
{
#region Public Constructors
/// <summary>
/// Costruttore
/// </summary>
/// <param name="messaggio"></param>
public PubSubEventArgs(string messaggio)
{
this.newMessage = messaggio;
}
#endregion Public Constructors
#region Public Properties
/// <summary>
/// Messaggio trasportato
/// </summary>
public string newMessage { get; set; } = "";
#endregion Public Properties
}
}