ActorHandleHelper.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using System;
  2. namespace ET.Server
  3. {
  4. public static class ActorHandleHelper
  5. {
  6. public static void Reply(int fromProcess, IActorResponse response)
  7. {
  8. if (fromProcess == Options.Instance.Process) // 返回消息是同一个进程
  9. {
  10. // NetInnerComponent.Instance.HandleMessage(realActorId, response); 等同于直接调用下面这句
  11. ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
  12. return;
  13. }
  14. Session replySession = NetInnerComponent.Instance.Get(fromProcess);
  15. replySession.Send(response);
  16. }
  17. public static void HandleIActorResponse(IActorResponse response)
  18. {
  19. ActorMessageSenderComponent.Instance.HandleIActorResponse(response);
  20. }
  21. /// <summary>
  22. /// 分发actor消息
  23. /// </summary>
  24. [EnableAccessEntiyChild]
  25. public static async ETTask HandleIActorRequest(long actorId, IActorRequest iActorRequest)
  26. {
  27. InstanceIdStruct instanceIdStruct = new(actorId);
  28. int fromProcess = instanceIdStruct.Process;
  29. instanceIdStruct.Process = Options.Instance.Process;
  30. long realActorId = instanceIdStruct.ToLong();
  31. Entity entity = Root.Instance.Get(realActorId);
  32. if (entity == null)
  33. {
  34. IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
  35. Reply(fromProcess, response);
  36. return;
  37. }
  38. MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
  39. if (mailBoxComponent == null)
  40. {
  41. Log.Warning($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorRequest}");
  42. IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
  43. Reply(fromProcess, response);
  44. return;
  45. }
  46. switch (mailBoxComponent.MailboxType)
  47. {
  48. case MailboxType.MessageDispatcher:
  49. {
  50. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
  51. {
  52. if (entity.InstanceId != realActorId)
  53. {
  54. IActorResponse response = ActorHelper.CreateResponse(iActorRequest, ErrorCore.ERR_NotFoundActor);
  55. Reply(fromProcess, response);
  56. break;
  57. }
  58. await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
  59. }
  60. break;
  61. }
  62. case MailboxType.UnOrderMessageDispatcher:
  63. {
  64. await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorRequest);
  65. break;
  66. }
  67. case MailboxType.GateSession:
  68. default:
  69. throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorRequest}");
  70. }
  71. }
  72. /// <summary>
  73. /// 分发actor消息
  74. /// </summary>
  75. [EnableAccessEntiyChild]
  76. public static async ETTask HandleIActorMessage(long actorId, IActorMessage iActorMessage)
  77. {
  78. InstanceIdStruct instanceIdStruct = new(actorId);
  79. int fromProcess = instanceIdStruct.Process;
  80. instanceIdStruct.Process = Options.Instance.Process;
  81. long realActorId = instanceIdStruct.ToLong();
  82. Entity entity = Root.Instance.Get(realActorId);
  83. if (entity == null)
  84. {
  85. Log.Error($"not found actor: {realActorId} {iActorMessage}");
  86. return;
  87. }
  88. MailBoxComponent mailBoxComponent = entity.GetComponent<MailBoxComponent>();
  89. if (mailBoxComponent == null)
  90. {
  91. Log.Error($"actor not found mailbox: {entity.GetType().Name} {realActorId} {iActorMessage}");
  92. return;
  93. }
  94. switch (mailBoxComponent.MailboxType)
  95. {
  96. case MailboxType.MessageDispatcher:
  97. {
  98. using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, realActorId))
  99. {
  100. if (entity.InstanceId != realActorId)
  101. {
  102. break;
  103. }
  104. await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
  105. }
  106. break;
  107. }
  108. case MailboxType.UnOrderMessageDispatcher:
  109. {
  110. await ActorMessageDispatcherComponent.Instance.Handle(entity, fromProcess, iActorMessage);
  111. break;
  112. }
  113. case MailboxType.GateSession:
  114. {
  115. if (entity is Session gateSession)
  116. {
  117. // 发送给客户端
  118. gateSession.Send(iActorMessage);
  119. }
  120. break;
  121. }
  122. default:
  123. throw new Exception($"no mailboxtype: {mailBoxComponent.MailboxType} {iActorMessage}");
  124. }
  125. }
  126. }
  127. }