diff --git a/MP.WASM.Mon/Server/Controllers/MSEController.cs b/MP.WASM.Mon/Server/Controllers/MSEController.cs index a1201fb6..072acb81 100644 --- a/MP.WASM.Mon/Server/Controllers/MSEController.cs +++ b/MP.WASM.Mon/Server/Controllers/MSEController.cs @@ -1,26 +1,18 @@ using Microsoft.AspNetCore.Mvc; using MP.Data.Conf; using MP.Data.DatabaseModels; -using MP.WASM.Mon.Data; +using MP.WASM.Mon.Server.Data; using Newtonsoft.Json; using NLog; -using StackExchange.Redis; namespace MP.WASM.Mon.Server.Controllers { [ApiController] [Route("api/[controller]")] - public class MSEController : ControllerBase, IDisposable + public class MSEController : ControllerBase //, IDisposable { #region Public Constructors - - - /// - /// Dataservice x accesso DB - /// - protected MpDataService _DataService { get; set; } - /// /// Avvio controller dei dati MSE /// @@ -31,15 +23,6 @@ namespace MP.WASM.Mon.Server.Controllers Log.Trace("Avviata classe MSEController"); } - /// - /// Dispone delle risorse quando non necessarie - /// - public void Dispose() - { - _DataService.Dispose(); - Log.Trace("Dispose classe MSEController"); - } - #endregion Public Constructors #region Public Properties @@ -53,12 +36,26 @@ namespace MP.WASM.Mon.Server.Controllers #region Public Methods + [HttpGet("checkAlive")] + public Task checkAlive() + { + Log.Trace("Check Alive"); + //string answ = (DateTime.Now.Second % 3 == 0) ? "KO": "OK"; + return Task.FromResult(JsonConvert.SerializeObject("OK")); + } + [HttpGet("getConfig")] public Task> ConfigGetAll() { return _DataService.ConfigGetAll(); } + [HttpGet("getAllTagConf")] + public Task>> getAllTags() + { + return _DataService.getAllTags(); + } + /// /// restituisce il valore da REDIS associato al tag richeisto /// @@ -76,35 +73,42 @@ namespace MP.WASM.Mon.Server.Controllers return _DataService.MacchineGetAll(); } - [HttpGet("getAllTagConf")] - public Task>> getAllTags() - { - return _DataService.getAllTags(); - } - /// /// Metodo principale x ricevere tutte i dati MSE di tutti gli impianti /// /// [HttpGet()] - public Task> MseGetAll() + public async Task> MseGetAll() { - return _DataService.MseGetAll(); + return await _DataService.MseGetAll(); } #endregion Public Methods + #region Protected Properties + + /// + /// Dataservice x accesso DB + /// + protected MpDataService _DataService { get; set; } + + #endregion Protected Properties + +#if fase + /// + /// Dispone delle risorse quando non necessarie + /// + public void Dispose() + { + _DataService.Dispose(); + Log.Trace("Dispose classe MSEController"); + } +#endif + #region Private Fields private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); - #endregion Private Fields - - #region Private Methods - - - - #endregion Private Methods } } \ No newline at end of file diff --git a/MP.WASM.Mon/Server/Controllers/MessageService.cs b/MP.WASM.Mon/Server/Controllers/MessageService.cs new file mode 100644 index 00000000..f6e7b0d0 --- /dev/null +++ b/MP.WASM.Mon/Server/Controllers/MessageService.cs @@ -0,0 +1,12 @@ +namespace MP.WASM.Mon.Server.Controllers +{ + public class MessageService + { + public static DateTime lastRead { get; set; } + + public MessageService() + { + lastRead = DateTime.MinValue; + } + } +} diff --git a/MP.WASM.Mon/Server/Data/MpDataService.cs b/MP.WASM.Mon/Server/Data/MpDataService.cs index 3bade9d2..921cb0c4 100644 --- a/MP.WASM.Mon/Server/Data/MpDataService.cs +++ b/MP.WASM.Mon/Server/Data/MpDataService.cs @@ -1,33 +1,28 @@ using MP.Data.Conf; using MP.Data.DatabaseModels; +using MP.WASM.Mon.Server.Controllers; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; using System.Text; -namespace MP.WASM.Mon.Data +namespace MP.WASM.Mon.Server.Data { public class MpDataService : IDisposable { #region Public Constructors - private int fastRefreshSec = 2; - - - public MpDataService(IConfiguration configuration, ILogger logger) + public MpDataService(IConfiguration configuration, ILogger logger, IConnectionMultiplexer redConn, MessageService MServ) { _logger = logger; _configuration = configuration; + _MServ = MServ; // setup compoenti REDIS + //this.redisConn = redConn; this.redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")); this.redisDb = this.redisConn.GetDatabase(); - //// setup canali pub/sub - //actLogPipe = new MessagePipe(redisConn, Constants.ACT_LOG_M_QUEUE); - - - //getConfValInt("MSE_cacheDuration", ref fastRefreshSec); // conf DB string connStr = _configuration.GetConnectionString("Mp.Mon"); @@ -39,11 +34,11 @@ namespace MP.WASM.Mon.Data { dbController = new MP.Data.Controllers.MpMonController(configuration); StringBuilder sb = new StringBuilder(); - sb.AppendLine($"DbController OK"); - //sb.AppendLine($"CST: {dbController.CustomersCount()} | CNT: {dbController.CountersCount()} | BSK: {dbController.BasketsCount()} | NGT: {dbController.NegotiationsCount()} | DOC: {dbController.DocsCount()} | ITM: {dbController.ItemsCount()} | RES: {dbController.ResourcesCount()}"); + sb.AppendLine($"MpDataService: DbController OK"); _logger.LogInformation(sb.ToString()); } - + // setup parametri opzionali + setupConf(); // setup conf IOB da dizionario tryLoadIobTags(); } @@ -72,6 +67,7 @@ namespace MP.WASM.Mon.Data { // Clear database controller dbController.Dispose(); + _logger.LogInformation("MpDataService disposed!"); } /// @@ -107,9 +103,16 @@ namespace MP.WASM.Mon.Data public async Task> MseGetAll() { + List result = new List(); + // se lettura in corso... attendo 10..50ms... + if (DateTime.Now.Subtract(MessageService.lastRead).TotalMilliseconds < 100) + { + Random rnd = new Random(); + await Task.Delay(rnd.Next(10, 50)); + } + Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); - List result = new List(); // cerco in redis... var rawData = await redisDb.StringGetAsync(redisMseKey); if (!string.IsNullOrEmpty(rawData)) @@ -117,40 +120,89 @@ namespace MP.WASM.Mon.Data result = JsonConvert.DeserializeObject>(rawData); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; - Log.Trace($"Read from REDIS: {ts.TotalMilliseconds}ms"); + Log.Trace($"REDIS Read: {ts.TotalMilliseconds:N2}ms"); } else { result = await Task.FromResult(dbController.MseGetAll()); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); - await redisDb.StringSetAsync(redisMseKey, rawData, TimeSpan.FromSeconds(2)); + await redisDb.StringSetAsync(redisMseKey, rawData, TimeSpan.FromSeconds(fastRefreshSec)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; - Log.Trace($"Read from DB: {ts.TotalMilliseconds}ms"); + Log.Trace($"DB Read: {ts.TotalMilliseconds:N2}ms"); } if (result == null) { result = new List(); } + MessageService.lastRead = DateTime.Now; return result; } #endregion Public Methods + #region Protected Methods + + /// + /// Recupera il valore e se trovato aggiorna + /// + /// Valore da cercare + /// String in cui salvare il valore se trovato + /// + protected bool getConfVal(string chiave, ref string varObj) + { + bool answ = false; + if (CurrConfig != null && CurrConfig.Count > 0) + { + // sistemo i parametri opzionali... + ConfigModel? risultato = CurrConfig.FirstOrDefault(x => x.Chiave == chiave); + if (risultato != null) + { + varObj = risultato.Valore; + answ = !string.IsNullOrEmpty(risultato.Valore); + } + } + return answ; + } + + /// + /// Recupera il valore e se trovato aggiorna + /// + /// Valore da cercare + /// Int in cui salvare il valore se trovato + /// + protected bool getConfValInt(string chiave, ref int varObj) + { + bool answ = false; + if (CurrConfig != null && CurrConfig.Count > 0) + { + // sistemo i parametri opzionali... + ConfigModel? risultato = CurrConfig.FirstOrDefault(x => x.Chiave == chiave); + if (risultato != null) + { + answ = int.TryParse(risultato.Valore, out varObj); + } + } + return answ; + } + + #endregion Protected Methods + #region Private Fields private static IConfiguration _configuration = null!; private static ILogger _logger = null!; - private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + private List? CurrConfig = null; + private int fastRefreshSec = 2; + private static MessageService _MServ = null!; /// /// Oggetto per connessione a REDIS /// private ConnectionMultiplexer redisConn = null!; - //ISubscriber sub = redis.GetSubscriber(); /// /// Oggetto DB redis da impiegare x chiamate R/W /// @@ -162,6 +214,17 @@ namespace MP.WASM.Mon.Data #region Private Methods + private void setupConf() + { + CurrConfig = dbController.ConfigGetAll(); + if (CurrConfig != null && CurrConfig.Count > 0) + { + // sistemo i parametri opzionali... + getConfValInt("MSE_cacheDuration", ref fastRefreshSec); + Log.Info($"Effettuato setup parametri | MSE_cacheDuration: {fastRefreshSec}"); + } + } + /// /// Prova a caricare da file la conf degli IOB se presente /// diff --git a/MP.WASM.Mon/Server/MP.WASM.Mon.Server.csproj b/MP.WASM.Mon/Server/MP.WASM.Mon.Server.csproj index c4145dd1..95f59c6f 100644 --- a/MP.WASM.Mon/Server/MP.WASM.Mon.Server.csproj +++ b/MP.WASM.Mon/Server/MP.WASM.Mon.Server.csproj @@ -25,6 +25,12 @@ + + + Always + + + diff --git a/MP.WASM.Mon/Server/NLog.config b/MP.WASM.Mon/Server/NLog.config index b32ba10a..44dc667f 100644 --- a/MP.WASM.Mon/Server/NLog.config +++ b/MP.WASM.Mon/Server/NLog.config @@ -41,6 +41,6 @@ --> - + \ No newline at end of file diff --git a/MP.WASM.Mon/Server/Program.cs b/MP.WASM.Mon/Server/Program.cs index cd8b0c3a..5f5eaf42 100644 --- a/MP.WASM.Mon/Server/Program.cs +++ b/MP.WASM.Mon/Server/Program.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.ResponseCompression; -using MP.WASM.Mon.Data; +using MP.WASM.Mon.Server.Controllers; +using MP.WASM.Mon.Server.Data; using StackExchange.Redis; var builder = WebApplication.CreateBuilder(args); @@ -21,6 +22,8 @@ var redisMultiplexer = ConnectionMultiplexer.Connect(connStringRedis); // aggiunta oggetti Singleton builder.Services.AddSingleton(redisMultiplexer); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); +//builder.Services.AddScoped(); var app = builder.Build(); diff --git a/MP.WASM.Mon/Server/logs/.placeholder b/MP.WASM.Mon/Server/logs/.placeholder new file mode 100644 index 00000000..5f282702 --- /dev/null +++ b/MP.WASM.Mon/Server/logs/.placeholder @@ -0,0 +1 @@ + \ No newline at end of file