AMActorLocationRpcHandler.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. namespace ET.Server
  3. {
  4. [EnableClass]
  5. public abstract class AMActorLocationRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorLocationRequest where Response : class, IActorLocationResponse
  6. {
  7. protected abstract ETTask Run(E unit, Request request, Response response);
  8. public async ETTask Handle(Entity entity, int fromProcess, object actorMessage)
  9. {
  10. try
  11. {
  12. if (actorMessage is not Request request)
  13. {
  14. Log.Error($"消息类型转换错误: {actorMessage.GetType().FullName} to {typeof (Request).Name}");
  15. return;
  16. }
  17. if (entity is not E ee)
  18. {
  19. Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof (E).Name} --{typeof (Request).Name}");
  20. return;
  21. }
  22. int rpcId = request.RpcId;
  23. Response response = Activator.CreateInstance<Response>();
  24. try
  25. {
  26. await this.Run(ee, request, response);
  27. }
  28. catch (Exception exception)
  29. {
  30. Log.Error(exception);
  31. response.Error = ErrorCore.ERR_RpcFail;
  32. response.Message = exception.ToString();
  33. }
  34. response.RpcId = rpcId;
  35. ActorHandleHelper.Reply(fromProcess, response);
  36. }
  37. catch (Exception e)
  38. {
  39. throw new Exception($"解释消息失败: {actorMessage.GetType().FullName}", e);
  40. }
  41. }
  42. public Type GetRequestType()
  43. {
  44. return typeof (Request);
  45. }
  46. public Type GetResponseType()
  47. {
  48. return typeof (Response);
  49. }
  50. }
  51. }