MessageSenderSystem.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ET.Server
  4. {
  5. [FriendOf(typeof(MessageSender))]
  6. public static partial class MessageSenderSystem
  7. {
  8. public static void Send(this MessageSender self, ActorId actorId, IMessage message)
  9. {
  10. Fiber fiber = self.Fiber();
  11. // 如果发向同一个进程,则扔到消息队列中
  12. if (actorId.Process == fiber.Process)
  13. {
  14. fiber.Root.GetComponent<ProcessInnerSender>().Send(actorId, message);
  15. return;
  16. }
  17. // 发给NetInner纤程
  18. A2NetInner_Message a2NetInnerMessage = A2NetInner_Message.Create();
  19. a2NetInnerMessage.FromAddress = fiber.Address;
  20. a2NetInnerMessage.ActorId = actorId;
  21. a2NetInnerMessage.MessageObject = message;
  22. MessageQueue.Instance.Send(new ActorId(fiber.Process, SceneType.NetInner), a2NetInnerMessage);
  23. }
  24. private static int GetRpcId(this MessageSender self)
  25. {
  26. return ++self.RpcId;
  27. }
  28. public static async ETTask<IResponse> Call(
  29. this MessageSender self,
  30. ActorId actorId,
  31. IRequest request,
  32. bool needException = true
  33. )
  34. {
  35. if (actorId == default)
  36. {
  37. throw new Exception($"actor id is 0: {request}");
  38. }
  39. Fiber fiber = self.Fiber();
  40. IResponse response;
  41. if (fiber.Process == actorId.Process)
  42. {
  43. response = await fiber.Root.GetComponent<ProcessInnerSender>().Call(actorId, request, needException: needException);
  44. }
  45. else
  46. {
  47. // 发给NetInner纤程
  48. A2NetInner_Request a2NetInner_Request = A2NetInner_Request.Create();
  49. a2NetInner_Request.ActorId = actorId;
  50. a2NetInner_Request.MessageObject = request;
  51. using A2NetInner_Response a2NetInnerResponse = await fiber.Root.GetComponent<ProcessInnerSender>().Call(
  52. new ActorId(fiber.Process, SceneType.NetInner), a2NetInner_Request) as A2NetInner_Response;
  53. response = a2NetInnerResponse.MessageObject;
  54. }
  55. if (response.Error == ErrorCode.ERR_MessageTimeout)
  56. {
  57. throw new RpcException(response.Error, $"Rpc error: request, 注意Actor消息超时,请注意查看是否死锁或者没有reply: actorId: {actorId} {request}, response: {response}");
  58. }
  59. if (needException && ErrorCode.IsRpcNeedThrowException(response.Error))
  60. {
  61. throw new RpcException(response.Error, $"Rpc error: actorId: {actorId} {request}, response: {response}");
  62. }
  63. return response;
  64. }
  65. }
  66. }