AMActorLocationRpcHandler.cs 2.0 KB

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