forked from ddrilling/AsbCloudServer
Refactor TelemetryTracker initialization
This commit is contained in:
parent
69ed4c5fb8
commit
f881a2eb55
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user