Просмотр исходного кода

调整消息的异常处理机制

tanghai 2 лет назад
Родитель
Сommit
7f10b46fbb
20 измененных файлов с 129 добавлено и 117 удалено
  1. BIN
      Config/Excel/cs/StartConfig/Release/StartSceneConfigCategory.bytes
  2. BIN
      Config/Excel/s/StartConfig/Release/StartSceneConfigCategory.bytes
  3. 1 0
      Config/Json/cs/StartConfig/Release/StartSceneConfig.txt
  4. 1 0
      Config/Json/s/StartConfig/Release/StartSceneConfig.txt
  5. 1 1
      Config/NLog/NLog.config
  6. BIN
      Unity/Assets/Config/Excel/StartConfig/Release/StartSceneConfig@s.xlsx
  7. 2 2
      Unity/Assets/Resources/GlobalConfig.asset
  8. 2 2
      Unity/Assets/Scripts/Core/Fiber/Module/Actor/MessageInnerSenderSystem.cs
  9. 3 3
      Unity/Assets/Scripts/Core/Network/RpcException.cs
  10. 13 2
      Unity/Assets/Scripts/Hotfix/Client/Demo/Main/ClientSenderCompnentSystem.cs
  11. 5 1
      Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/MessageLocationHandler.cs
  12. 1 1
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs
  13. 7 11
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageOuterSenderSystem.cs
  14. 20 9
      Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageSenderSystem.cs
  15. 5 1
      Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MessageHandler.cs
  16. 0 65
      Unity/Assets/Scripts/Model/Server/Module/Message/MessageSessionHandler.cs
  17. 0 11
      Unity/Assets/Scripts/Model/Server/Module/Message/MessageSessionHandler.cs.meta
  18. 0 2
      Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs
  19. 68 0
      Unity/Assets/Scripts/Model/Share/Module/Message/MessageSessionHandler.cs
  20. 0 6
      Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

BIN
Config/Excel/cs/StartConfig/Release/StartSceneConfigCategory.bytes


BIN
Config/Excel/s/StartConfig/Release/StartSceneConfigCategory.bytes


+ 1 - 0
Config/Json/cs/StartConfig/Release/StartSceneConfig.txt

@@ -7,6 +7,7 @@
 [12, {"_t":"StartSceneConfig","_id":12,"Process":2,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
 [13, {"_t":"StartSceneConfig","_id":13,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
 [14, {"_t":"StartSceneConfig","_id":14,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
+[15, {"_t":"StartSceneConfig","_id":15,"Process":2,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
 [30, {"_t":"StartSceneConfig","_id":30,"Process":3,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
 [31, {"_t":"StartSceneConfig","_id":31,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
 [32, {"_t":"StartSceneConfig","_id":32,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],

+ 1 - 0
Config/Json/s/StartConfig/Release/StartSceneConfig.txt

@@ -7,6 +7,7 @@
 [12, {"_t":"StartSceneConfig","_id":12,"Process":2,"Zone":1,"SceneType":"Location","Name":"Location","Port":0}],
 [13, {"_t":"StartSceneConfig","_id":13,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map1","Port":0}],
 [14, {"_t":"StartSceneConfig","_id":14,"Process":2,"Zone":1,"SceneType":"Map","Name":"Map2","Port":0}],
+[15, {"_t":"StartSceneConfig","_id":15,"Process":2,"Zone":1,"SceneType":"Match","Name":"Match","Port":0}],
 [30, {"_t":"StartSceneConfig","_id":30,"Process":3,"Zone":3,"SceneType":"RouterManager","Name":"RouterManager","Port":30300}],
 [31, {"_t":"StartSceneConfig","_id":31,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router01","Port":30301}],
 [32, {"_t":"StartSceneConfig","_id":32,"Process":3,"Zone":3,"SceneType":"Router","Name":"Router02","Port":30302}],

+ 1 - 1
Config/NLog/NLog.config

@@ -52,7 +52,7 @@
 				archiveFileName="${basedir}/../Logs/${logger}.${var:appIdFormat}.{#}.Error.log"
 				fileName="${basedir}/../Logs/${logger}.${var:appIdFormat}.${date:format=yyyyMMddHH}.Error.log"
 				deleteOldFileOnStartup="false"
-				layout="${longdate} ${message}" />
+				layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=3} ${message}" />
 	</targets>
 
 	<targets async="true">

BIN
Unity/Assets/Config/Excel/StartConfig/Release/StartSceneConfig@s.xlsx


+ 2 - 2
Unity/Assets/Resources/GlobalConfig.asset

@@ -12,6 +12,6 @@ MonoBehaviour:
   m_Script: {fileID: 11500000, guid: 36527db572638af47b03c805671cba75, type: 3}
   m_Name: GlobalConfig
   m_EditorClassIdentifier: 
-  CodeMode: 3
+  CodeMode: 1
   BuildType: 1
-  AppType: 7
+  AppType: 8

+ 2 - 2
Unity/Assets/Scripts/Core/Fiber/Module/Actor/MessageInnerSenderSystem.cs

@@ -75,13 +75,13 @@ namespace ET
         {
             if (response.Error == ErrorCore.ERR_MessageTimeout)
             {
-                self.Tcs.SetException(new Exception($"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
+                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
                 return;
             }
 
             if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
             {
-                self.Tcs.SetException(new Exception($"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
+                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
                 return;
             }
 

+ 3 - 3
Unity/Assets/Scripts/Core/Network/RpcException.cs

@@ -12,14 +12,14 @@ namespace ET
             get;
         }
 
-        public RpcException(int error, string message): base($"Error: {error} Message: {message}")
+        public RpcException(int error, string message): base(message)
         {
             this.Error = error;
         }
 
-        public RpcException(int error, string message, Exception e): base($"Error: {error} Message: {message}", e)
+        public override string ToString()
         {
-            this.Error = error;
+            return $"Error: {this.Error}\n{base.ToString()}";
         }
     }
 }

+ 13 - 2
Unity/Assets/Scripts/Hotfix/Client/Demo/Main/ClientSenderCompnentSystem.cs

@@ -40,8 +40,19 @@
         {
             A2NetClient_Request a2NetClientRequest = A2NetClient_Request.Create();
             a2NetClientRequest.MessageObject = request;
-            A2NetClient_Response response = await self.Fiber().MessageInnerSender.Call(self.netClientActorId, a2NetClientRequest, needException: needException) as A2NetClient_Response;
-            return response.MessageObject;
+            A2NetClient_Response a2NetClientResponse = await self.Fiber().MessageInnerSender.Call(self.netClientActorId, a2NetClientRequest) as A2NetClient_Response;
+            IResponse response = a2NetClientResponse.MessageObject;
+                        
+            if (response.Error == ErrorCore.ERR_MessageTimeout)
+            {
+                throw new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: {request}, response: {response}");
+            }
+
+            if (needException && ErrorCore.IsRpcNeedThrowException(response.Error))
+            {
+                throw new RpcException(response.Error, $"Rpc error: {request}, response: {response}");
+            }
+            return response;
         }
 
     }

+ 5 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/ActorLocation/MessageLocationHandler.cs

@@ -70,9 +70,13 @@ namespace ET.Server
                 {
                     await this.Run(ee, request, response);
                 }
+                catch (RpcException exception)
+                {
+                    response.Error = exception.Error;
+                    response.Message = exception.ToString();
+                }
                 catch (Exception exception)
                 {
-                    Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
                 }

+ 1 - 1
Unity/Assets/Scripts/Hotfix/Server/Module/Message/A2NetInner_RequestHandler.cs

@@ -7,7 +7,7 @@ namespace ET.Server
     {
         protected override async ETTask Run(Scene root, A2NetInner_Request request, A2NetInner_Response response)
         {
-            response.MessageObject = await root.GetComponent<MessageOuterSender>().Call(request.ActorId, request.MessageObject, request.NeedException);
+            response.MessageObject = await root.GetComponent<MessageOuterSender>().Call(request.ActorId, request.MessageObject, false);
         }
     }
 }

+ 7 - 11
Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageOuterSenderSystem.cs

@@ -67,16 +67,12 @@ namespace ET.Server
                     self.HandleIActorResponse(iActorResponse);
                     return;
                 }
-                case ILocationRequest iActorRequest:
+                case ILocationRequest:
+                case IRequest:
                 {
-                    IResponse response = await fiber.MessageInnerSender.Call(actorId, iActorRequest, false);
-                    actorId.Process = fromProcess;
-                    self.Send(actorId, response);
-                    break;
-                }
-                case IRequest iActorRequest:
-                {
-                    IResponse response = await fiber.MessageInnerSender.Call(actorId, iActorRequest);
+                    IRequest request = (IRequest)message;
+                    // 注意这里都不能抛异常,因为这里只是中转消息
+                    IResponse response = await fiber.MessageInnerSender.Call(actorId, request, false);
                     actorId.Process = fromProcess;
                     self.Send(actorId, response);
                     break;
@@ -148,13 +144,13 @@ namespace ET.Server
         {
             if (response.Error == ErrorCore.ERR_MessageTimeout)
             {
-                self.Tcs.SetException(new Exception($"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
+                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {self.ActorId} {self.Request}, response: {response}"));
                 return;
             }
 
             if (self.NeedException && ErrorCore.IsRpcNeedThrowException(response.Error))
             {
-                self.Tcs.SetException(new Exception($"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
+                self.Tcs.SetException(new RpcException(response.Error, $"Rpc error: actorId: {self.ActorId} request: {self.Request}, response: {response}"));
                 return;
             }
 

+ 20 - 9
Unity/Assets/Scripts/Hotfix/Server/Module/Message/MessageSenderSystem.cs

@@ -53,29 +53,40 @@ namespace ET
                 this MessageSender self,
                 ActorId actorId,
                 int rpcId,
-                IRequest iRequest,
+                IRequest request,
                 bool needException = true
         )
         {
             if (actorId == default)
             {
-                throw new Exception($"actor id is 0: {iRequest}");
+                throw new Exception($"actor id is 0: {request}");
             }
             Fiber fiber = self.Fiber();
+            
             if (fiber.Process == actorId.Process)
             {
-                return await fiber.Root.GetComponent<MessageInnerSender>().Call(actorId, rpcId, iRequest, needException);
+                return await fiber.MessageInnerSender.Call(actorId, rpcId, request);
             }
-            
+
             // 发给NetInner纤程
             A2NetInner_Request a2NetInner_Request = A2NetInner_Request.Create();
             a2NetInner_Request.ActorId = actorId;
-            a2NetInner_Request.MessageObject = iRequest;
-            a2NetInner_Request.NeedException = needException;
+            a2NetInner_Request.MessageObject = request;
             StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.NetInners[fiber.Process];
-            A2NetInner_Response response = await fiber.Root.GetComponent<MessageSender>().Call(
-                startSceneConfig.ActorId, a2NetInner_Request, needException: a2NetInner_Request.NeedException) as A2NetInner_Response;
-            return response.MessageObject;
+            A2NetInner_Response a2NetInnerResponse = await fiber.MessageInnerSender.Call(
+                startSceneConfig.ActorId, a2NetInner_Request) as A2NetInner_Response;
+            IResponse response = a2NetInnerResponse.MessageObject;
+            
+            if (response.Error == ErrorCore.ERR_MessageTimeout)
+            {
+                throw new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {actorId} {request}, response: {response}");
+            }
+
+            if (needException && ErrorCore.IsRpcNeedThrowException(response.Error))
+            {
+                throw new RpcException(response.Error, $"Rpc error: actorId: {actorId} {request}, response: {response}");
+            }
+            return response;
         }
     }
 }

+ 5 - 1
Unity/Assets/Scripts/Hotfix/Share/Module/Actor/MessageHandler.cs

@@ -73,9 +73,13 @@ namespace ET
                 {
                     await this.Run(ee, request, response);
                 }
+                catch (RpcException exception)
+                {
+                    response.Error = exception.Error;
+                    response.Message = exception.ToString();
+                }
                 catch (Exception exception)
                 {
-                    Log.Error(exception);
                     response.Error = ErrorCore.ERR_RpcFail;
                     response.Message = exception.ToString();
                 }

+ 0 - 65
Unity/Assets/Scripts/Model/Server/Module/Message/MessageSessionHandler.cs

@@ -1,65 +0,0 @@
-using System;
-
-namespace ET.Server
-{
-    public abstract class MessageSessionHandler<Request, Response>: IMessageSessionHandler where Request : MessageObject, IRequest where Response : MessageObject, IResponse
-    {
-        protected abstract ETTask Run(Session session, Request request, Response response);
-
-        public void Handle(Session session, object message)
-        {
-            HandleAsync(session, message).Coroutine();
-        }
-
-        private async ETTask HandleAsync(Session session, object message)
-        {
-            try
-            {
-                using Request request = message as Request;
-                if (request == null)
-                {
-                    throw new Exception($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).FullName}");
-                }
-
-                int rpcId = request.RpcId;
-                long instanceId = session.InstanceId;
-
-                Response response = ObjectPool.Instance.Fetch<Response>();
-
-                try
-                {
-                    await this.Run(session, request, response);
-                }
-                catch (Exception exception)
-                {
-                    Log.Error(exception);
-                    response.Error = ErrorCore.ERR_RpcFail;
-                    response.Message = exception.ToString();
-                }
-                
-                // 等回调回来,session可以已经断开了,所以需要判断session InstanceId是否一样
-                if (session.InstanceId != instanceId)
-                {
-                    return;
-                }
-                
-                response.RpcId = rpcId; // 在这里设置rpcId是为了防止在Run中不小心修改rpcId字段
-                session.Send(response);
-            }
-            catch (Exception e)
-            {
-                throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
-            }
-        }
-
-        public Type GetMessageType()
-        {
-            return typeof (Request);
-        }
-
-        public Type GetResponseType()
-        {
-            return typeof (Response);
-        }
-    }
-}

+ 0 - 11
Unity/Assets/Scripts/Model/Server/Module/Message/MessageSessionHandler.cs.meta

@@ -1,11 +0,0 @@
-fileFormatVersion: 2
-guid: 5a7b0bfe21cabcb4cbfc124f15294a0b
-MonoImporter:
-  externalObjects: {}
-  serializedVersion: 2
-  defaultReferences: []
-  executionOrder: 0
-  icon: {instanceID: 0}
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 

+ 0 - 2
Unity/Assets/Scripts/Model/Server/Module/NetInner/A2NetInner_Message.cs

@@ -37,14 +37,12 @@ namespace ET
             this.RpcId = default;
             this.ActorId = default;
             this.MessageObject = default;
-            this.NeedException = default;
             
             ObjectPool.Instance.Recycle(this);
         }
         
         public int RpcId { get; set; }
         public ActorId ActorId;
-        public bool NeedException;
         public IRequest MessageObject;
     }
     

+ 68 - 0
Unity/Assets/Scripts/Model/Share/Module/Message/MessageSessionHandler.cs

@@ -39,4 +39,72 @@ namespace ET
             return null;
         }
     }
+    
+    
+    public abstract class MessageSessionHandler<Request, Response>: IMessageSessionHandler where Request : MessageObject, IRequest where Response : MessageObject, IResponse
+    {
+        protected abstract ETTask Run(Session session, Request request, Response response);
+
+        public void Handle(Session session, object message)
+        {
+            HandleAsync(session, message).Coroutine();
+        }
+
+        private async ETTask HandleAsync(Session session, object message)
+        {
+            try
+            {
+                using Request request = message as Request;
+                if (request == null)
+                {
+                    throw new Exception($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).FullName}");
+                }
+
+                int rpcId = request.RpcId;
+                long instanceId = session.InstanceId;
+
+                Response response = ObjectPool.Instance.Fetch<Response>();
+
+                try
+                {
+                    await this.Run(session, request, response);
+                }
+                catch (RpcException exception)
+                {
+                    // 这里不能返回堆栈给客户端
+                    Log.Error(exception.ToString());
+                    response.Error = exception.Error;
+                }
+                catch (Exception exception)
+                {
+                    // 这里不能返回堆栈给客户端
+                    Log.Error(exception.ToString());
+                    response.Error = ErrorCore.ERR_RpcFail;
+                }
+                
+                // 等回调回来,session可以已经断开了,所以需要判断session InstanceId是否一样
+                if (session.InstanceId != instanceId)
+                {
+                    return;
+                }
+                
+                response.RpcId = rpcId; // 在这里设置rpcId是为了防止在Run中不小心修改rpcId字段
+                session.Send(response);
+            }
+            catch (Exception e)
+            {
+                throw new Exception($"解释消息失败: {message.GetType().FullName}", e);
+            }
+        }
+
+        public Type GetMessageType()
+        {
+            return typeof (Request);
+        }
+
+        public Type GetResponseType()
+        {
+            return typeof (Response);
+        }
+    }
 }

+ 0 - 6
Unity/Assets/Scripts/Model/Share/Module/Message/Session.cs

@@ -55,12 +55,6 @@ namespace ET
             {
                 return;
             }
-
-            if (ErrorCore.IsRpcNeedThrowException(response.Error))
-            {
-                action.Tcs.SetException(new Exception($"Rpc error, request: {action.Request} response: {response}"));
-                return;
-            }
             action.Tcs.SetResult(response);
         }