瀏覽代碼

skip 3mins problem

Robert 10 月之前
父節點
當前提交
8d5c00f752

+ 4 - 3
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -1047,15 +1047,16 @@ namespace EVCB_OCPP.WSServer
             string requestId = string.Empty;
             MessageResult response = null;
             Func<Task<string>> sendTask = null;
+            Func<string, Task> sendTask2 = null;
 
             var displayPriceText = await webDbService.SetDefaultFee(session);
             UpdateClientDisplayPrice(session.ChargeBoxId, displayPriceText);
 
             if (!string.IsNullOrEmpty(displayPriceText))
             {
-                sendTask = async () => await messageService.SendChangeConfigurationRequest(
-                    session.ChargeBoxId, key: "DefaultPrice", value: displayPriceText);
-                await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, session.DisconnetCancellationToken);
+                sendTask2 = async (string serialNo) => await messageService.SendChangeConfigurationRequest(
+                    session.ChargeBoxId, key: "DefaultPrice", value: displayPriceText, serialNo: serialNo);
+                await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask2, session.DisconnetCancellationToken);
             }
 
             if (session.CustomerId == new Guid("298918C0-6BB5-421A-88CC-4922F918E85E") || session.CustomerId == new Guid("9E6BFDCC-09FB-4DAB-A428-43FE507600A3"))

+ 29 - 16
EVCB_OCPP.WSServer/Service/ConfirmWaitingMessageSerevice.cs

@@ -210,23 +210,29 @@ namespace EVCB_OCPP.WSServer.Service
             return message;
         }
 
-        internal async Task<object> WaitResultAsync(string serialNo, int maxWaitSec = 65000, CancellationToken token = default)
+        internal async Task<object> SendAndWaitUntilResultAsync(Func<string, Task> startSendTaskFunc, CancellationToken token = default)
         {
-            //if (!needConfirmPacketList.Select(x => x.RequestId).Contains(serialNo))
-            //{
-            //    logger.LogWarning("msg {msg} not in wait list", serialNo);
-            //    var checkResult = await mainDbService.TryGetResponseFromDb(serialNo, token);
-            //    if (checkResult is not null)
-            //    {
-            //        logger.LogWarning("{msg} found in db", serialNo);
-            //        return checkResult;
-            //    }
-            //    logger.LogWarning("{msg} not found in db", serialNo);
-            //}
+            object message;
+            do
+            {
+                var SerialNo = Guid.NewGuid().ToString();
+                var waitObject = CreateAndAddWaitObject(SerialNo);
+                await startSendTaskFunc(SerialNo);
+                message = await WaitResultAsync(SerialNo, waitObject: waitObject, token: token);
+            }
+            while (message == null && !token.IsCancellationRequested);
+            return message;
+        }
 
-            var waiObj = new MessageResultWaitObject();
-            asyncWaitingTasks.Add(serialNo, waiObj);
-            var task = waiObj.Lock.WaitAsync(token);
+        internal async Task<object> WaitResultAsync(string serialNo, MessageResultWaitObject waitObject = null, int maxWaitSec = 65000, CancellationToken token = default)
+        {
+            if (waitObject == null)
+            {
+                waitObject = new MessageResultWaitObject();
+                asyncWaitingTasks.Add(serialNo, waitObject);
+            }
+
+            var task = waitObject.Lock.WaitAsync(token);
             var completedTask = await Task.WhenAny(task, Task.Delay(180_000, token));
             if (completedTask != task)
             {
@@ -240,7 +246,14 @@ namespace EVCB_OCPP.WSServer.Service
                 logger.LogWarning("{msg} not found in db", serialNo);
                 return null;
             }
-            return waiObj.Result.Message;
+            return waitObject.Result.Message;
+        }
+
+        private MessageResultWaitObject CreateAndAddWaitObject(string serialNo)
+        {
+            var waiObj = new MessageResultWaitObject();
+            asyncWaitingTasks.Add(serialNo, waiObj);
+            return waiObj;
         }
 
         private void RemoveWaitingMsg(

+ 7 - 4
EVCB_OCPP.WSServer/Service/ServerMessageService.cs

@@ -22,17 +22,18 @@ public class ServerMessageService
     private readonly IMainDbService mainDbService;
     private readonly ILogger<ServerMessageService> logger;
 
-    internal Task<string> SendGetEVSEConfigureRequest(string chargeBoxId)
+    internal Task<string> SendGetEVSEConfigureRequest(string chargeBoxId, string serialNo = "")
     {
         if (string.IsNullOrEmpty(chargeBoxId)) return null;
         return mainDbService.AddServerMessage(
             ChargeBoxId: chargeBoxId,
             OutAction: Actions.GetConfiguration.ToString(),
-            OutRequest: new GetConfigurationRequest() { key = new List<string>() }
+            OutRequest: new GetConfigurationRequest() { key = new List<string>() },
+            SerialNo: serialNo
             );
     }
 
-    internal Task<string> SendChangeConfigurationRequest(string chargeBoxId, string key, string value)
+    internal Task<string> SendChangeConfigurationRequest(string chargeBoxId, string key, string value, string serialNo = "")
     {
         return mainDbService.AddServerMessage(
             ChargeBoxId: chargeBoxId,
@@ -41,7 +42,9 @@ public class ServerMessageService
             {
                 key = key,
                 value = value
-            });
+            },
+            SerialNo: serialNo
+            );
     }
 
     internal Task<string> SendDataTransferRequest(string chargeBoxId, string messageId, string vendorId, string data)

+ 2 - 2
EVCB_OCPP.WSServer/Service/StationConfigService.cs

@@ -164,7 +164,7 @@ public class StationConfigService
 
     private async Task<GetConfigurationConfirmation> GetEvseCurrentConfig(string chargeBoxId, CancellationToken token = default)
     {
-        var sendTask = async () => await messageService.SendGetEVSEConfigureRequest(chargeBoxId);
+        var sendTask = async (string serialNo) => await messageService.SendGetEVSEConfigureRequest(chargeBoxId, serialNo: serialNo);
         var response = await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, token);
         if (response is GetConfigurationConfirmation confirmation)
         {
@@ -206,7 +206,7 @@ public class StationConfigService
             }
 
             object response = null;
-            var sendTask = async () => await messageService.SendChangeConfigurationRequest(chargeBoxId, config.Key, config.Value);
+            var sendTask = async (string serialNo) => await messageService.SendChangeConfigurationRequest(chargeBoxId, config.Key, config.Value, serialNo: serialNo);
             response = await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, token);
         }
     }

+ 1 - 1
EVCB_OCPP.WSServer/Service/VendorIdUpdateService.cs

@@ -86,7 +86,7 @@ namespace EVCB_OCPP.WSServer.Service
 
         private async Task<GetConfigurationConfirmation> GetEvseCurrentConfig(string chargeBoxId, CancellationToken token = default)
         {
-            var sendTask = async () => await messageService.SendGetEVSEConfigureRequest(chargeBoxId);
+            var sendTask = async (string serialNo) => await messageService.SendGetEVSEConfigureRequest(chargeBoxId, serialNo: serialNo);
             var response = await confirmWaitingMessageSerevice.SendAndWaitUntilResultAsync(sendTask, token);
             if (response is GetConfigurationConfirmation confirm)
             {