using StackExchange.Redis; using System; namespace SteamWare { /// /// Classe gestione PubSub messaggi REDIS /// public class MessagePipe { #region Private Fields private bool enableLog = false; private IConnectionMultiplexer redis; private IDatabase redisDb; #endregion Private Fields #region Protected Fields /// /// Obj x gestione log /// protected static NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); #endregion Protected Fields #region Public Constructors /// /// Init canale di comunicazione PubSub via REDIS /// /// /// 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 /// /// Messaggio veicolato dal canale /// public event EventHandler EA_NewMessage = delegate { }; #endregion Public Events #region Private Properties /// /// Canale associato al gestore pipeline messaggi /// 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 /// /// Invio messaggio sul canale + salvataggio in cache REDIS /// /// Chiave REDIS x salvare valore /// 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; } /// /// Invio messaggio sul canale /// /// /// public bool sendMessage(string newMess) { bool answ = false; ISubscriber sub = redis.GetSubscriber(); sub.Publish(_channel, newMess); return answ; } #endregion Public Methods } /// /// Evento messaggio PubSub Redis /// public class PubSubEventArgs : EventArgs { #region Public Constructors /// /// Costruttore /// /// public PubSubEventArgs(string messaggio) { this.newMessage = messaggio; } #endregion Public Constructors #region Public Properties /// /// Messaggio trasportato /// public string newMessage { get; set; } = ""; #endregion Public Properties } }