Sfoglia il codice sorgente

faster HeartBeatCheckTrigger

Robert 1 anno fa
parent
commit
124190df9c

+ 9 - 7
EVCB_OCPP.WSServer/Jobs/HeartBeatCheckJob.cs

@@ -47,13 +47,15 @@ public class HeartBeatCheckJob : IJob
 
             watch.Start();
 
-            var datas = new List<Machine>();
-            foreach (var session in clients)
-            {
-                var machine = new Machine() { Id = session.MachineId, HeartbeatUpdatedOn = cdt, ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1 };
-                datas.Add(machine);
-            }
-            await mainDbService.UpdateHeartBeats(datas);
+            //var datas = new List<Machine>();
+            //foreach (var session in clients)
+            //{
+            //    var machine = new Machine() { Id = session.MachineId, HeartbeatUpdatedOn = cdt, ConnectionType = session.UriScheme.Equals("wss") ? 2 : 1 };
+            //    datas.Add(machine);
+            //}
+            //await mainDbService.UpdateHeartBeats(datas);
+            var toUpdateMachineIds = clients.Select(x => x.MachineId).ToList();
+            await mainDbService.UpdateHeartBeats(toUpdateMachineIds);
 
             watch.Stop();
             if (watch.ElapsedMilliseconds / 1000 > 5)

+ 1 - 0
EVCB_OCPP.WSServer/Message/SmartChargingProfileHandler.cs

@@ -5,6 +5,7 @@ using EVCB_OCPP.Packet.Messages;
 using EVCB_OCPP.Packet.Messages.SmartCharging;
 using EVCB_OCPP.Packet.Messages.SubTypes;
 using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
 using OCPPServer.Protocol;
 using System;

+ 30 - 0
EVCB_OCPP.WSServer/Service/MainDbService.cs

@@ -38,6 +38,8 @@ public interface IMainDbService
     Task<TransactionRecord> GetTransactionForStopTransaction(int transactionId, string chargeBoxId);
     Task UpdateTransaction(int transactionId, int meterStop, DateTime stopTime, int stopReasonId, string stopReason, string stopIdTag, string receipt, int cost);
     Task<bool> UpdateHeartBeats(IEnumerable<Machine> heartBeatsData);
+    Task<bool> UpdateHeartBeats(List<string> machineIds);
+
     Task UpdateTransactionSOC(int id, string startsoc, string stopsoc);
 }
 
@@ -369,6 +371,11 @@ public class MainDbService : IMainDbService
         //return UpdateHeartBeatsEF(heartBeatsData);
         return UpdateHeartBeatsDapper(heartBeatsData);
     }
+    public Task<bool> UpdateHeartBeats(List<string> machineIds)
+    {
+        return UpdateHeartBeatsDapper(machineIds);
+    }
+
     private void InitUpdateConnectorStatusHandler()
     {
         if (statusNotificationHandler is not null)
@@ -893,6 +900,29 @@ public class MainDbService : IMainDbService
         return true;
     }
 
+    private async Task<bool> UpdateHeartBeatsDapper(List<string> machineIds)
+    {
+        using var conn = await sqlConnectionFactory.CreateAsync();
+        try
+        {
+            var parameters = new DynamicParameters();
+            parameters.Add("@Ids", machineIds, size: 36);
+            parameters.Add("@HeartbeatUpdatedOn", DateTime.UtcNow, DbType.DateTime, ParameterDirection.Input);
+            var resultCnt = await conn.ExecuteAsync("""
+                UPDATE Machine
+                SET HeartbeatUpdatedOn = @HeartbeatUpdatedOn
+                WHERE Id in @Ids
+                """, parameters);
+        }
+        catch (Exception e)
+        {
+            logger.LogError(e.Message);
+            logger.LogCritical("HeartBeatCheckTrigger update fail");
+            return false;
+        }
+        return true;
+    }
+
     private async Task<bool> UpdateHeartBeatsEF(IEnumerable<Machine> heartBeatsData)
     {
         using var db = await contextFactory.CreateDbContextAsync();