Refactor TelemetryTracker initialization

This commit is contained in:
Фролов 2021-11-10 16:59:48 +05:00
parent 69ed4c5fb8
commit f881a2eb55

View File

@ -5,6 +5,8 @@ using System.Linq;
using AsbCloudDb.Model; using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services.Cache; using AsbCloudInfrastructure.Services.Cache;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Services namespace AsbCloudInfrastructure.Services
{ {
@ -27,7 +29,7 @@ namespace AsbCloudInfrastructure.Services
public DateTime LastTimeRemote { get; set; } public DateTime LastTimeRemote { get; set; }
} }
private readonly Dictionary<string, TrackerStat> requests; private readonly ConcurrentDictionary<string, TrackerStat> requests;
public TelemetryTracker(CacheDb cacheDb) public TelemetryTracker(CacheDb cacheDb)
{ {
@ -37,29 +39,67 @@ namespace AsbCloudInfrastructure.Services
using var db = new AsbCloudDbContext(options); using var db = new AsbCloudDbContext(options);
var cacheTelemetry = cacheDb.GetCachedTable<Telemetry>(db); var cacheTelemetry = cacheDb.GetCachedTable<Telemetry>(db);
var keyValuePairs = new Dictionary<string, TrackerStat>(cacheTelemetry.Count());
foreach (var telemetry in cacheTelemetry)
{
var date = telemetry.Info?.DrillingStartDate
?? GetDateByUidOrDefault(telemetry.RemoteUid, DateTime.MinValue);
var lastTelemetriesDates = (from d in db.TelemetryDataSaub keyValuePairs[telemetry.RemoteUid] = new TrackerStat {
group d by d.IdTelemetry into g RemoteUid = telemetry.RemoteUid,
select new LastTimeRemote = date,
LastTimeServer = date,
};
}
requests = new ConcurrentDictionary<string, TrackerStat>(keyValuePairs);
Task.Run(async() => {
db.Database.SetCommandTimeout(2 * 60);
var dates = await db.TelemetryDataSaub
.GroupBy(d => d.IdTelemetry)
.Select(g => new
{ {
IdTelemetry = g.Key, IdTelemetry = g.Key,
Date = g.Max(t => t.Date) Date = g.Max(d=>d.Date)
}) })
.AsNoTracking() .AsNoTracking()
.ToList(); .ToListAsync()
.ConfigureAwait(false);
db.Dispose();
requests = lastTelemetriesDates.Select(t => new var oldReqs = dates.Select(t => new
{ {
//Id = t.IdTelemetry, Uid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid,
RemoteUid = cacheTelemetry.FirstOrDefault(c => c.Id == t.IdTelemetry).RemoteUid, t.Date,
LastTimeRemote = t.Date,
}).ToDictionary(t => t.RemoteUid, t => new TrackerStat {
//Id = t.Id,
RemoteUid = t.RemoteUid,
LastTimeRemote = t.LastTimeRemote,
LastTimeServer = t.LastTimeRemote,
}); });
foreach (var oldReq in oldReqs)
{
var request = requests.GetValueOrDefault(oldReq.Uid);
if(request is not null)
{
if (request.LastTimeRemote < oldReq.Date)
request.LastTimeRemote = oldReq.Date;
if (request.LastTimeServer < oldReq.Date)
request.LastTimeServer = oldReq.Date;
}
}
});
}
private static DateTime GetDateByUidOrDefault(string remoteUid, DateTime defaultValue = default)
{
//eg: uid = 20211102_173407926
if (string.IsNullOrEmpty(remoteUid) || (remoteUid.Length != 18))
return defaultValue;
if (DateTime.TryParseExact(remoteUid, "yyyyMMdd_HHmmssfff",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.AssumeUniversal,
out DateTime parsedDate))
return parsedDate;
return defaultValue;
} }
public void SaveRequestDate(string uid, DateTime remoteDate) public void SaveRequestDate(string uid, DateTime remoteDate)