AMActorRpcHandler.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. namespace ET.Server
  3. {
  4. public abstract class AMActorRpcHandler<E, Request, Response>: IMActorHandler where E : Entity where Request : class, IActorRequest where Response : class, IActorResponse
  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. if (typeof (IActorLocationRequest).IsAssignableFrom(typeof (Request)))
  50. {
  51. Log.Error($"message is IActorLocationMessage but handler is AMActorRpcHandler: {typeof (Request)}");
  52. }
  53. return typeof (Request);
  54. }
  55. public Type GetResponseType()
  56. {
  57. return typeof (Response);
  58. }
  59. }
  60. }