MON Server / WASM
- fine tuning cache - test velocità recupero dati
This commit is contained in:
@@ -3,38 +3,13 @@ using MP.Data.DatabaseModels;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using StackExchange.Redis;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
|
||||
namespace MP.Mon.Data
|
||||
{
|
||||
public class MpDataService : IDisposable
|
||||
{
|
||||
#region Public Fields
|
||||
|
||||
public static MP.Data.Controllers.MpMonController dbController { get; set; } = null!;
|
||||
|
||||
#endregion Public Fields
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration = null!;
|
||||
private static ILogger<MpDataService> _logger = null!;
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private IDatabase redisDb = null!;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Public Constructors
|
||||
|
||||
public MpDataService(IConfiguration configuration, ILogger<MpDataService> logger)
|
||||
@@ -71,6 +46,8 @@ namespace MP.Mon.Data
|
||||
|
||||
#region Public Properties
|
||||
|
||||
public static MP.Data.Controllers.MpMonController dbController { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Dizionario dei tag configurati per IOB
|
||||
/// </summary>
|
||||
@@ -91,6 +68,15 @@ namespace MP.Mon.Data
|
||||
dbController.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco setup dei tag conf correnti
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Task<Dictionary<string, List<TagData>>> getAllTags()
|
||||
{
|
||||
return Task.FromResult(currTagConf);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// restituisce il valore da REDIS associato al tag richeisto
|
||||
/// </summary>
|
||||
@@ -108,8 +94,6 @@ namespace MP.Mon.Data
|
||||
return outVal;
|
||||
}
|
||||
|
||||
private string redisMseKey = "MP:MON:Cache:MSE";
|
||||
|
||||
public Task<List<Macchine>> MacchineGetAll()
|
||||
{
|
||||
return Task.FromResult(dbController.MacchineGetAll());
|
||||
@@ -117,29 +101,27 @@ namespace MP.Mon.Data
|
||||
|
||||
public async Task<List<MappaStatoExpl>> MseGetAll()
|
||||
{
|
||||
#if false
|
||||
var dbResult = dbController.MseGetAll();
|
||||
if (dbResult == null)
|
||||
{
|
||||
dbResult = new List<MappaStatoExpl>();
|
||||
}
|
||||
return Task.FromResult(dbResult);
|
||||
#endif
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
List<MappaStatoExpl> result = new List<MappaStatoExpl>();
|
||||
// cerco in redis...
|
||||
var rawData = await redisDb.StringGetAsync(redisMseKey);
|
||||
if (!string.IsNullOrEmpty(rawData))
|
||||
{
|
||||
Log.Trace("Read from REDIS");
|
||||
result = JsonConvert.DeserializeObject<List<MappaStatoExpl>>(rawData);
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Read from REDIS: {ts.TotalMilliseconds}ms");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Trace("Read from DB");
|
||||
result = await Task.FromResult(dbController.MseGetAll());
|
||||
// serializzp e salvo...
|
||||
rawData = JsonConvert.SerializeObject(result);
|
||||
await redisDb.StringSetAsync(redisMseKey, rawData, TimeSpan.FromSeconds(2));
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Read from DB: {ts.TotalMilliseconds}ms");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
@@ -150,6 +132,28 @@ namespace MP.Mon.Data
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration = null!;
|
||||
private static ILogger<MpDataService> _logger = null!;
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private IDatabase redisDb = null!;
|
||||
|
||||
private string redisMseKey = "MP:MON:Cache:MSE";
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
@@ -173,7 +177,8 @@ namespace MP.Mon.Data
|
||||
var fileConfData = JsonConvert.DeserializeObject<IobTags>(rawData);
|
||||
if (fileConfData != null)
|
||||
{
|
||||
// effettuo esplosione conf SE contenesse il valore "***" = tutti gli IOB
|
||||
// effettuo esplosione conf SE contenesse il valore "***" = tutti
|
||||
// gli IOB
|
||||
if (fileConfData.IobSetup.ContainsKey("***"))
|
||||
{
|
||||
// recupero elenco macchine...
|
||||
@@ -184,8 +189,8 @@ namespace MP.Mon.Data
|
||||
{
|
||||
if (!string.IsNullOrEmpty(item.IdxMacchina))
|
||||
{
|
||||
// converto i valori x la macchina corrente...
|
||||
// clono in nuovo oggetto
|
||||
// converto i valori x la macchina corrente... clono in
|
||||
// nuovo oggetto
|
||||
var specVal = baseConf.Value.Select(i => i.Clone()).ToList();
|
||||
// sostituisco segnaposto
|
||||
foreach (var singleVal in specVal)
|
||||
@@ -217,7 +222,6 @@ namespace MP.Mon.Data
|
||||
currConf.Add(item.IdxMacchina, specVal);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// altrimenti copio ed ho finito
|
||||
else
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Version>6.15.2207.819</Version>
|
||||
<Version>6.15.2207.909</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<body>
|
||||
<i>Modulo MON MAPO</i>
|
||||
<h4>Versione: 6.15.2207.819</h4>
|
||||
<h4>Versione: 6.15.2207.909</h4>
|
||||
<br /> Note di rilascio:
|
||||
<ul>
|
||||
<li>
|
||||
|
||||
@@ -1 +1 @@
|
||||
6.15.2207.819
|
||||
6.15.2207.909
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<item>
|
||||
<version>6.15.2207.819</version>
|
||||
<version>6.15.2207.909</version>
|
||||
<url>https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/MP.Mon.zip</url>
|
||||
<changelog>https://nexus.steamware.net/repository/SWS/MP-MON/stable/LAST/ChangeLog.html</changelog>
|
||||
<mandatory>false</mandatory>
|
||||
|
||||
@@ -24,14 +24,10 @@ namespace MP.WASM.Mon.Server.Controllers
|
||||
/// Avvio controller dei dati MSE
|
||||
/// </summary>
|
||||
/// <param name="DataService"></param>
|
||||
public MSEController(MpDataService DataService, IConfiguration configuration, ILogger<MSEController> logger)
|
||||
public MSEController(MpDataService DataService)
|
||||
{
|
||||
_logger = logger;
|
||||
_configuration = configuration;
|
||||
_DataService = DataService;
|
||||
Log.Info("Avviata classe MSEController");
|
||||
// setup conf IOB da dizionario
|
||||
tryLoadIobTags();
|
||||
}
|
||||
|
||||
#endregion Public Constructors
|
||||
@@ -70,6 +66,12 @@ namespace MP.WASM.Mon.Server.Controllers
|
||||
return _DataService.MacchineGetAll();
|
||||
}
|
||||
|
||||
[HttpGet("getAllTagConf")]
|
||||
public Task<Dictionary<string, List<TagData>>> getAllTags()
|
||||
{
|
||||
return _DataService.getAllTags();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Metodo principale x ricevere tutte i dati MSE di tutti gli impianti
|
||||
/// </summary>
|
||||
@@ -84,108 +86,14 @@ namespace MP.WASM.Mon.Server.Controllers
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration = null!;
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
//private static ILogger<MSEController> _logger = null!;
|
||||
private readonly ILogger<MSEController> _logger;
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private IDatabase redisDb = null!;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
/// Prova a caricare da file la conf degli IOB se presente
|
||||
/// </summary>
|
||||
private void tryLoadIobTags()
|
||||
{
|
||||
Dictionary<string, List<TagData>> currConf = new Dictionary<string, List<TagData>>();
|
||||
string strExeFilePath = System.Reflection.Assembly.GetExecutingAssembly().Location;
|
||||
if (!string.IsNullOrEmpty(strExeFilePath))
|
||||
{
|
||||
string? strWorkPath = Path.GetDirectoryName(strExeFilePath);
|
||||
if (!string.IsNullOrEmpty(strWorkPath))
|
||||
{
|
||||
string filePath = $"{strWorkPath}/Conf/iobTagsConf.json";
|
||||
if (System.IO.File.Exists(filePath))
|
||||
{
|
||||
string rawData = System.IO.File.ReadAllText(filePath);
|
||||
if (!string.IsNullOrEmpty(rawData))
|
||||
{
|
||||
var fileConfData = JsonConvert.DeserializeObject<IobTags>(rawData);
|
||||
if (fileConfData != null)
|
||||
{
|
||||
// effettuo esplosione conf SE contenesse il valore "***" = tutti
|
||||
// gli IOB
|
||||
if (fileConfData.IobSetup.ContainsKey("***"))
|
||||
{
|
||||
// recupero elenco macchine...
|
||||
var elencoMacc = _DataService.MacchineGetAll().Result;
|
||||
// x ogni macchina creo le righe standard da conf...
|
||||
var baseConf = fileConfData.IobSetup.Where(x => x.Key == "***").FirstOrDefault();
|
||||
foreach (var item in elencoMacc)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(item.IdxMacchina))
|
||||
{
|
||||
// converto i valori x la macchina corrente... clono in
|
||||
// nuovo oggetto
|
||||
var specVal = baseConf.Value.Select(i => i.Clone()).ToList();
|
||||
// sostituisco segnaposto
|
||||
foreach (var singleVal in specVal)
|
||||
{
|
||||
singleVal.TagLocation = singleVal.TagLocation.Replace("***", item.IdxMacchina);
|
||||
}
|
||||
// ora aggiungo eventuali valori in override...
|
||||
if (fileConfData.IobSetup.ContainsKey(item.IdxMacchina))
|
||||
{
|
||||
var otConf = fileConfData.IobSetup.Where(x => x.Key == item.IdxMacchina).FirstOrDefault();
|
||||
//verifico x ogni valore other...
|
||||
foreach (var otTag in otConf.Value)
|
||||
{
|
||||
var ovrTag = specVal.Where(x => x.ColNum == otTag.ColNum && x.RowNum == otTag.RowNum).FirstOrDefault();
|
||||
// se contiene --> sovrascrivo
|
||||
if (ovrTag != null)
|
||||
{
|
||||
//ovrTag = otTag.Clone();
|
||||
specVal.Remove(ovrTag);
|
||||
specVal.Add(otTag.Clone());
|
||||
}
|
||||
// se non contiene --> aggiungo
|
||||
else
|
||||
{
|
||||
specVal.Add(otTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
currConf.Add(item.IdxMacchina, specVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
// altrimenti copio ed ho finito
|
||||
else
|
||||
{
|
||||
currConf = fileConfData.IobSetup;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (currConf != null)
|
||||
{
|
||||
currTagConf = currConf;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
|
||||
@@ -3,38 +3,13 @@ using MP.Data.DatabaseModels;
|
||||
using Newtonsoft.Json;
|
||||
using NLog;
|
||||
using StackExchange.Redis;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
|
||||
namespace MP.WASM.Mon.Data
|
||||
{
|
||||
public class MpDataService : IDisposable
|
||||
{
|
||||
#region Public Fields
|
||||
|
||||
public static MP.Data.Controllers.MpMonController dbController { get; set; } = null!;
|
||||
|
||||
#endregion Public Fields
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration = null!;
|
||||
private static ILogger<MpDataService> _logger = null!;
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private IDatabase redisDb = null!;
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Public Constructors
|
||||
|
||||
public MpDataService(IConfiguration configuration, ILogger<MpDataService> logger)
|
||||
@@ -71,6 +46,8 @@ namespace MP.WASM.Mon.Data
|
||||
|
||||
#region Public Properties
|
||||
|
||||
public static MP.Data.Controllers.MpMonController dbController { get; set; } = null!;
|
||||
|
||||
/// <summary>
|
||||
/// Dizionario dei tag configurati per IOB
|
||||
/// </summary>
|
||||
@@ -91,6 +68,15 @@ namespace MP.WASM.Mon.Data
|
||||
dbController.Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Elenco setup dei tag conf correnti
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public Task<Dictionary<string, List<TagData>>> getAllTags()
|
||||
{
|
||||
return Task.FromResult(currTagConf);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// restituisce il valore da REDIS associato al tag richeisto
|
||||
/// </summary>
|
||||
@@ -110,21 +96,64 @@ namespace MP.WASM.Mon.Data
|
||||
|
||||
public Task<List<Macchine>> MacchineGetAll()
|
||||
{
|
||||
return Task.FromResult(dbController.MacchineGetAll().ToList());
|
||||
return Task.FromResult(dbController.MacchineGetAll());
|
||||
}
|
||||
|
||||
public Task<List<MappaStatoExpl>> MseGetAll()
|
||||
public async Task<List<MappaStatoExpl>> MseGetAll()
|
||||
{
|
||||
var dbResult = dbController.MseGetAll();
|
||||
if (dbResult == null)
|
||||
Stopwatch stopWatch = new Stopwatch();
|
||||
stopWatch.Start();
|
||||
List<MappaStatoExpl> result = new List<MappaStatoExpl>();
|
||||
// cerco in redis...
|
||||
var rawData = await redisDb.StringGetAsync(redisMseKey);
|
||||
if (!string.IsNullOrEmpty(rawData))
|
||||
{
|
||||
dbResult = new List<MappaStatoExpl>();
|
||||
result = JsonConvert.DeserializeObject<List<MappaStatoExpl>>(rawData);
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Read from REDIS: {ts.TotalMilliseconds}ms");
|
||||
}
|
||||
return Task.FromResult(dbResult);
|
||||
else
|
||||
{
|
||||
result = await Task.FromResult(dbController.MseGetAll());
|
||||
// serializzp e salvo...
|
||||
rawData = JsonConvert.SerializeObject(result);
|
||||
await redisDb.StringSetAsync(redisMseKey, rawData, TimeSpan.FromSeconds(2));
|
||||
stopWatch.Stop();
|
||||
TimeSpan ts = stopWatch.Elapsed;
|
||||
Log.Trace($"Read from DB: {ts.TotalMilliseconds}ms");
|
||||
}
|
||||
if (result == null)
|
||||
{
|
||||
result = new List<MappaStatoExpl>();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion Public Methods
|
||||
|
||||
#region Private Fields
|
||||
|
||||
private static IConfiguration _configuration = null!;
|
||||
private static ILogger<MpDataService> _logger = null!;
|
||||
|
||||
private static NLog.Logger Log = LogManager.GetCurrentClassLogger();
|
||||
|
||||
/// <summary>
|
||||
/// Oggetto per connessione a REDIS
|
||||
/// </summary>
|
||||
private ConnectionMultiplexer redisConn = null!;
|
||||
|
||||
//ISubscriber sub = redis.GetSubscriber();
|
||||
/// <summary>
|
||||
/// Oggetto DB redis da impiegare x chiamate R/W
|
||||
/// </summary>
|
||||
private IDatabase redisDb = null!;
|
||||
|
||||
private string redisMseKey = "MP:MON:Cache:MSE";
|
||||
|
||||
#endregion Private Fields
|
||||
|
||||
#region Private Methods
|
||||
|
||||
/// <summary>
|
||||
@@ -148,7 +177,8 @@ namespace MP.WASM.Mon.Data
|
||||
var fileConfData = JsonConvert.DeserializeObject<IobTags>(rawData);
|
||||
if (fileConfData != null)
|
||||
{
|
||||
// effettuo esplosione conf SE contenesse il valore "***" = tutti gli IOB
|
||||
// effettuo esplosione conf SE contenesse il valore "***" = tutti
|
||||
// gli IOB
|
||||
if (fileConfData.IobSetup.ContainsKey("***"))
|
||||
{
|
||||
// recupero elenco macchine...
|
||||
@@ -159,8 +189,8 @@ namespace MP.WASM.Mon.Data
|
||||
{
|
||||
if (!string.IsNullOrEmpty(item.IdxMacchina))
|
||||
{
|
||||
// converto i valori x la macchina corrente...
|
||||
// clono in nuovo oggetto
|
||||
// converto i valori x la macchina corrente... clono in
|
||||
// nuovo oggetto
|
||||
var specVal = baseConf.Value.Select(i => i.Clone()).ToList();
|
||||
// sostituisco segnaposto
|
||||
foreach (var singleVal in specVal)
|
||||
@@ -192,7 +222,6 @@ namespace MP.WASM.Mon.Data
|
||||
currConf.Add(item.IdxMacchina, specVal);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// altrimenti copio ed ho finito
|
||||
else
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
|
||||
autoReload="true"
|
||||
throwExceptions="false"
|
||||
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
|
||||
|
||||
<!-- optional, add some variables
|
||||
https://github.com/nlog/NLog/wiki/Configuration-file#variables
|
||||
-->
|
||||
<variable name="myvar" value="myvalue" />
|
||||
|
||||
<!--
|
||||
See https://github.com/nlog/nlog/wiki/Configuration-file
|
||||
for information on customizing logging rules and outputs.
|
||||
-->
|
||||
<targets>
|
||||
|
||||
<!--
|
||||
add your targets here
|
||||
See https://github.com/nlog/NLog/wiki/Targets for possible targets.
|
||||
See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
|
||||
-->
|
||||
|
||||
<!--
|
||||
Write events to a file with the date in the filename.
|
||||
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
|
||||
layout="${longdate} ${uppercase:${level}} ${message}" />
|
||||
-->
|
||||
<target xsi:type="File" name="fileTarget" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} | ${uppercase:${level}} | ${logger:shortName=false} | ${message}" />
|
||||
<target xsi:type="ColoredConsole" name="consoleTarget" layout="${longdate} | ${uppercase:${level}} | ${logger:shortName=true} | ${message}" />
|
||||
</targets>
|
||||
|
||||
<rules>
|
||||
<!-- add your logging rules here -->
|
||||
|
||||
<!--
|
||||
Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f"
|
||||
<logger name="*" minlevel="Debug" writeTo="f" />
|
||||
-->
|
||||
<logger name="*" minlevel="Trace" writeTo="consoleTarget" />
|
||||
<!--<logger name="Microsoft.*" maxlevel="Info" final="true" />-->
|
||||
<logger name="*" minlevel="Info" writeTo="fileTarget" />
|
||||
</rules>
|
||||
</nlog>
|
||||
Reference in New Issue
Block a user