Browse Source

optimize GroupHandler

Robert 1 year ago
parent
commit
a17ffab468

+ 27 - 13
EVCB_OCPP.TaskScheduler/Helper/GroupHandler.cs

@@ -14,7 +14,7 @@ namespace EVCB_OCPP.TaskScheduler.Helper;
 public class GroupHandler<T>
 {
     public GroupHandler(
-        Func<IEnumerable<T>, Task<BundleHandlerResult<T>>> handleFunc,
+        Func<BundleHandlerData<T>, Task> handleFunc,
         ILogger logger, int workerCnt = 1, int maxRetry = 10)
     {
         this.handleFunc = handleFunc;
@@ -25,7 +25,7 @@ public class GroupHandler<T>
         //singleWorkLock = new(_WorkerCnt);
     }
 
-    private readonly Func<IEnumerable<T> , Task<BundleHandlerResult<T>>> handleFunc;
+    private readonly Func<BundleHandlerData<T> , Task> handleFunc;
     private readonly ILogger logger;
     private readonly int maxRetry;
     private readonly ConcurrentQueue<WaitParam<T>> waitList = new();
@@ -79,20 +79,29 @@ public class GroupHandler<T>
 
         for (; cnt < maxRetry; cnt ++)
         {
-            var result = await handleFunc(datas);
-            var completedRequests = requests.Where(x => result.CompletedDatas.Contains(x.Data)).ToList();
+            var bundleHandledata = new BundleHandlerData<T>(datas);
+            try
+            {
+                await handleFunc(bundleHandledata);
+            }
+            catch (Exception e)
+            {
+                lastException = e;
+            }
+
+            var completedRequests = requests.Where(x => bundleHandledata.CompletedDatas.Contains(x.Data)).ToList();
             foreach (var request in completedRequests)
             {
                 request.Waiter.Release();
             }
 
-            datas = datas.Except(result.CompletedDatas).ToList();
-            lastException = result.Exception;
+            datas = datas.Except(bundleHandledata.CompletedDatas).ToList();
+
             if (datas.IsNullOrEmpty())
             {
                 break;
             }
-            logger.LogError(lastException.Message);
+            logger.LogError(lastException?.Message);
             times.Add(timer.ElapsedMilliseconds);
         }
 
@@ -114,15 +123,20 @@ public class GroupHandler<T>
     }
 }
 
-public class BundleHandlerResult<T>
+public class BundleHandlerData<T>
 {
-    public IEnumerable<T> CompletedDatas { get; set; }
-    public Exception Exception { get; set; }
+    public List<T> Datas { get; set; }
+    public List<T> CompletedDatas { get; set; }
+
+    public BundleHandlerData(List<T> datas)
+    {
+        Datas = datas;
+        CompletedDatas = new();
+    }
 
-    public BundleHandlerResult(IEnumerable<T> completedDatas, Exception exception)
+    public void AddCompletedData(T competedData)
     {
-        CompletedDatas = completedDatas;
-        Exception = exception;
+        CompletedDatas.Add(competedData);
     }
 }
 

+ 15 - 28
EVCB_OCPP.TaskScheduler/Services/MainDbService.cs

@@ -48,42 +48,29 @@ public class MainDbService
             );
     }
 
-    private async Task<BundleHandlerResult<UpdateEvseOnlineModel>> BundleUpdateEvseOnlineStatus(IEnumerable<UpdateEvseOnlineModel> datas)
+    private async Task BundleUpdateEvseOnlineStatus(BundleHandlerData<UpdateEvseOnlineModel> bundleData)
     {
-        List<UpdateEvseOnlineModel> completedDatas = new();
-        Exception exception = null;
-
         using var dbConn = await sqlConnectionFactory.CreateAsync();
-        foreach (var data in datas)
+        foreach (var data in bundleData.Datas)
         {
-            try
-            {
-                string sqlString = $"""
-                UPDATE dbo.Machine
-                SET Online=@Online {(data.online? "": ", OfflineOn = @OfflineOn")}
-                WHERE chargeBoxId = @ChargeBoxId
-                """;
-
-                var parameters = new DynamicParameters();
-                parameters.Add("@Online", data.online, System.Data.DbType.Boolean);
-                parameters.Add("@ChargeBoxId", data.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 50);
+            string sqlString = $"""
+            UPDATE dbo.Machine
+            SET Online=@Online {(data.online? "": ", OfflineOn = @OfflineOn")}
+            WHERE chargeBoxId = @ChargeBoxId
+            """;
 
-                if (!data.online)
-                {
-                    parameters.Add("@OfflineOn", data.offlineTime, System.Data.DbType.DateTime);
-                }
+            var parameters = new DynamicParameters();
+            parameters.Add("@Online", data.online, System.Data.DbType.Boolean);
+            parameters.Add("@ChargeBoxId", data.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 50);
 
-                await dbConn.ExecuteAsync(sqlString, parameters);
-                completedDatas.Add(data);
-            }
-            catch (Exception ex)
+            if (!data.online)
             {
-                exception = ex;
-                logger.LogError("Update Data Error " + ex.ToString());
-                break;
+                parameters.Add("@OfflineOn", data.offlineTime, System.Data.DbType.DateTime);
             }
+
+            await dbConn.ExecuteAsync(sqlString, parameters);
+            bundleData.AddCompletedData(data);
         }
-        return new BundleHandlerResult<UpdateEvseOnlineModel>(completedDatas, exception);
     }
 }
 

+ 19 - 45
EVCB_OCPP.TaskScheduler/Services/OnlineLogDbService.cs

@@ -100,11 +100,8 @@ public class OnlineLogDbService
         await dbConn.ExecuteAsync(sqlString, parameters);
     }
 
-    private async Task<BundleHandlerResult<EVSEOnlineRecord>> BundleUpdateWithDapper(IEnumerable<EVSEOnlineRecord> records)
+    private async Task BundleUpdateWithDapper(BundleHandlerData<EVSEOnlineRecord> bundleHandlerData)
     {
-        List<EVSEOnlineRecord> comtpetedRecords = new();
-        Exception exception = null; 
-
         string sqlString = """
             UPDATE dbo.EVSEOnlineRecord 
             SET OfflineTime=@OfflineTime 
@@ -116,57 +113,34 @@ public class OnlineLogDbService
             )
             """;
 
-        try
-        {
-            using var dbConn = await connectionFactory.CreateAsync();
-            foreach (var record in records)
-            {
-                var parameters = new DynamicParameters();
-                parameters.Add("@ChargeBoxId", record.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
-                parameters.Add("@OfflineTime", record.OfflineTime, System.Data.DbType.DateTime);
-                //parameters.Add("@Id", record.Id, System.Data.DbType.Int64);
-                await dbConn.ExecuteAsync(sqlString, parameters);
-                comtpetedRecords.Add(record);
-            }
-        }
-        catch (Exception e)
+        using var dbConn = await connectionFactory.CreateAsync();
+        foreach (var record in bundleHandlerData.Datas)
         {
-            exception = e;
+            var parameters = new DynamicParameters();
+            parameters.Add("@ChargeBoxId", record.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
+            parameters.Add("@OfflineTime", record.OfflineTime, System.Data.DbType.DateTime);
+            //parameters.Add("@Id", record.Id, System.Data.DbType.Int64);
+            await dbConn.ExecuteAsync(sqlString, parameters);
+            bundleHandlerData.AddCompletedData(record);
         }
-        
-        return new BundleHandlerResult<EVSEOnlineRecord>(comtpetedRecords, exception);
     }
 
-    private async Task<BundleHandlerResult<EVSEOnlineRecord>> BundleInsertWithDapper(IEnumerable<EVSEOnlineRecord> records)
+    private async Task BundleInsertWithDapper(BundleHandlerData<EVSEOnlineRecord> bundleHandlerData)
     {
-        List<EVSEOnlineRecord> completedDatas = new();
-        Exception exception = null;
-
         string sqlString = """
             INSERT INTO dbo.EVSEOnlineRecord ("ChargeBoxId","OnlineTime","OfflineTime")
             VALUES( @ChargeBoxId, @OnlineTime, @OfflineTime);
             """;
-        try
-        {
-            using var dbConn = await connectionFactory.CreateAsync();
-            foreach (var record in records)
-            {
-                var parameters = new DynamicParameters();
-                parameters.Add("@ChargeBoxId", record.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
-                parameters.Add("@OnlineTime", record.OnlineTime, System.Data.DbType.DateTime);
-                parameters.Add("@OfflineTime", DefaultSetting.DefaultNullTime, System.Data.DbType.DateTime);
-                await dbConn.ExecuteAsync(sqlString, parameters);
-                completedDatas.Add(record);
-            }
-        }
-        catch (Exception e)
-        {
-            logger.LogError(e.Message);
-            logger.LogError(e.StackTrace);
 
-            exception = e;
+        using var dbConn = await connectionFactory.CreateAsync();
+        foreach (var record in bundleHandlerData.Datas)
+        {
+            var parameters = new DynamicParameters();
+            parameters.Add("@ChargeBoxId", record.ChargeBoxId, System.Data.DbType.String, System.Data.ParameterDirection.Input, 36);
+            parameters.Add("@OnlineTime", record.OnlineTime, System.Data.DbType.DateTime);
+            parameters.Add("@OfflineTime", DefaultSetting.DefaultNullTime, System.Data.DbType.DateTime);
+            await dbConn.ExecuteAsync(sqlString, parameters);
+            bundleHandlerData.AddCompletedData(record);
         }
-        
-        return new BundleHandlerResult<EVSEOnlineRecord>(completedDatas, exception);
     }
 }

+ 6 - 2
Prod_Build.bat

@@ -1,3 +1,7 @@
 for /f %%i in ('git rev-parse --short HEAD') do set ssha=%%i
-docker build ./ -t evdevcontainerregistry.azurecr.io/task:%ssha% --label "git-commit=%ssha%"
-docker push evdevcontainerregistry.azurecr.io/task:%ssha%
+FOR /f %%i IN ( version.txt ) DO set version=%%i
+git push
+git tag -a %version%
+git push --follow-tags
+docker build ./ -t evdevcontainerregistry.azurecr.io/task:%version% --label "git-commit=%ssha%"
+docker push evdevcontainerregistry.azurecr.io/task:%version%

+ 1 - 0
version.txt

@@ -0,0 +1 @@
+DockerTrans_v1.0.0