using EgwCoreLib.Lux.Data.Services; using EgwCoreLib.Lux.Data; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; using EgwMultiEngineManager.Data; namespace Lux.API.Services { public class ExternalMessageProcessor { #region Public Constructors /// /// Init classe message processor con accesso REDIS e DB /// /// /// public ExternalMessageProcessor(ImageCacheService imgService, DataLayerServices dlService) { cacheService = imgService; dbService = dlService; } #endregion Public Constructors #region Public Methods public async Task HandleResultMessageAsync(string channel, string message) { Log.Info($"Processing message from {channel} | {message.Length}"); Stopwatch sw = new Stopwatch(); sw.Start(); string rawData = $"{message}"; if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2) { try { var retData = JsonConvert.DeserializeObject(rawData); if (retData != null) { if (retData.Args != null && retData.Args.Count > 0) { if (retData.Args.ContainsKey("Svg")) { // dovrei leggere dagli args l'IUID dell'SVG ritornato... // salvo SVG string newSvg = retData.Args["Svg"]; string UID = retData.Args["UID"]; await cacheService.SaveSvgAsync(UID, retData.ExecEnvironment, newSvg); } if (retData.Args.ContainsKey("BOM")) { string newBom = retData.Args["BOM"]; string UID = retData.Args["UID"]; // salvo BOM ricevuta RAW in redis await cacheService.SaveBomAsync(UID, retData.ExecEnvironment, newBom); // salvo la BOM completa con i dati recuperati dal DB await dbService.SaveBomAsync(UID, retData.ExecEnvironment, newBom); // pubblico refresh info così da segnalare richeista di update conseguente await cacheService.PublishUpdateAsync(UID, retData.ExecEnvironment); } if (retData.Args.ContainsKey("HardwareModelList")) { // salvo HardwareList ricevuta string newHml = retData.Args["HardwareModelList"]; string UID = retData.Args["UID"]; await cacheService.SaveHmlAsync(UID, retData.ExecEnvironment, newHml); await dbService.SaveHmlAsync(UID, retData.ExecEnvironment, newHml); } } } } catch (Exception exc) { Log.Error($"Errore in fase decodifica messaggio da REDIS Channel{Environment.NewLine}{exc}"); } } sw.Stop(); Log.Info($"HandleResultMessageAsync | {sw.Elapsed.TotalMilliseconds:N3} ms"); #if false // Process message (parse, validate, act) var payload = message; // or JSON-deserialize, etc. await _redisService.SetAsync("last:result", payload); #endif } #endregion Public Methods #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); private readonly ImageCacheService cacheService; private readonly DataLayerServices dbService; #endregion Private Fields #if false /// /// Restituisce una risposta all'esecuzione /// /// private void ProcessMan_m_AnswerReceived(ProcessArgsResult result) { // verifico che sia la mia richiesta con id immagine... FARE!!! // salvo il risultato... if (result.Args != null && result.Args.Count > 0) { if (result.Args.ContainsKey("Svg")) { // salvo SVG string newSvg = result.Args["Svg"]; // salvo nel dizionario lastSvg = newSvg; // salvo su redis _imgService.SaveSvg("123456", lastSvg); } } } /// /// Salva risultato calcolo da broadcast channel REDIS /// /// /// private void SaveCalcData(RedisChannel channel, RedisValue message) { string rawData = $"{message}"; if (!string.IsNullOrEmpty(rawData) && rawData.Length > 2) { // provo a deserializzare try { var retData = JsonConvert.DeserializeObject(rawData); if (retData != null) { // verifico nId di risposta x salvare correttamente ProcessMan_m_AnswerReceived(retData); } } catch (Exception exc) { _logger.LogError($"Errore in fase decodifica messaggio da REDIS Channel{Environment.NewLine}{exc}"); } } } #endif } }