using EVCB_OCPP.Domain; using EVCB_OCPP.WSServer.Service.DbService; using EVCB_OCPP.WSServer.Service.WsService; using Microsoft.Extensions.Logging; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EVCB_OCPP.WSServer.Jobs; [DisallowConcurrentExecution] public class HealthCheckTriggerJob : IJob { public HealthCheckTriggerJob( ProtalServer protalServer, IMainDbService mainDbService, ILogger logger) { this.protalServer = protalServer; this.mainDbService = mainDbService; this.logger = logger; } private readonly ProtalServer protalServer; private readonly IMainDbService mainDbService; private readonly ILogger logger; public async Task Execute(IJobExecutionContext context) { //logger.LogDebug("{0} Started", nameof(HealthCheckTriggerJob)); Dictionary _copyClientDic = protalServer.GetClientDic(); Dictionary chargeBoxHeartBeatIngerval = await GetChargeBoxIdleSeconds(_copyClientDic?.Keys?.ToList()); var removeClients = _copyClientDic .Where(x => x.Value.LastActiveTime < DateTime.UtcNow.AddSeconds(-1 * chargeBoxHeartBeatIngerval[x.Key])) .Select(x => x.Value) .ToList(); foreach (var session in removeClients) { logger.LogDebug("Server forced to shut down ChargeBox ({0}: LastActiveTime{1})", session.ChargeBoxId, session.LastActiveTime); protalServer.RemoveClient(session, "Inactive"); } return ; } private async Task> GetChargeBoxIdleSeconds(List chageboxList) { if (chageboxList is null) { return new Dictionary(); } var getHeartbeatIntervalTasks = chageboxList.Select(async x => (x, await mainDbService.GetMachineHeartbeatInterval(x))).ToList(); await Task.WhenAll(getHeartbeatIntervalTasks); var chargeBoxHeartbeatIntervalIntervalPair = getHeartbeatIntervalTasks.Select(x => x.Result).ToDictionary(x => x.x, x=> x.Item2 ); Dictionary toReturn = new Dictionary(); foreach (var chageboxId in chageboxList) { //var heartBeatIntervalString = await mainDbService.GetMachineHeartbeatInterval(chageboxId); var heartBeatIntervalString = chargeBoxHeartbeatIntervalIntervalPair.Keys.Contains(chageboxId) ? chargeBoxHeartbeatIntervalIntervalPair[chageboxId] : "0"; int idelSeconds = 300; if (int.TryParse(heartBeatIntervalString, out var parsedInterval) && parsedInterval * 2 > idelSeconds) { idelSeconds = parsedInterval * 2; } toReturn.Add(chageboxId, idelSeconds); } return toReturn; } }