AMActorRpcHandler.cs 2.3 KB

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