ActorLocationSenderComponentSystem.cs 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. namespace ET
  3. {
  4. public class ActorLocationSenderComponentAwakeSystem : AwakeSystem<ActorLocationSenderComponent>
  5. {
  6. public override void Awake(ActorLocationSenderComponent self)
  7. {
  8. ActorLocationSenderComponent.Instance = self;
  9. // 每10s扫描一次过期的actorproxy进行回收,过期时间是1分钟
  10. // 可能由于bug或者进程挂掉,导致ActorLocationSender发送的消息没有确认,结果无法自动删除,每一分钟清理一次这种ActorLocationSender
  11. self.CheckTimer = TimerComponent.Instance.NewRepeatedTimer(10 * 1000, self.Check);
  12. }
  13. }
  14. public class ActorLocationSenderComponentDestroySystem: DestroySystem<ActorLocationSenderComponent>
  15. {
  16. public override void Destroy(ActorLocationSenderComponent self)
  17. {
  18. ActorLocationSenderComponent.Instance = null;
  19. TimerComponent.Instance.Remove(self.CheckTimer);
  20. self.CheckTimer = 0;
  21. }
  22. }
  23. public static class ActorLocationSenderComponentSystem
  24. {
  25. public static void Check(this ActorLocationSenderComponent self, bool isTimeOut)
  26. {
  27. using (ListComponent<long> list = EntityFactory.Create<ListComponent<long>>(self.Domain))
  28. {
  29. long timeNow = TimeHelper.Now();
  30. foreach ((long key, Entity value) in self.Children)
  31. {
  32. ActorLocationSender actorLocationMessageSender = (ActorLocationSender) value;
  33. if (timeNow > actorLocationMessageSender.LastSendOrRecvTime + ActorLocationSenderComponent.TIMEOUT_TIME)
  34. {
  35. list.List.Add(key);
  36. }
  37. }
  38. foreach (long id in list.List)
  39. {
  40. self.Remove(id);
  41. }
  42. }
  43. }
  44. private static ActorLocationSender Get(this ActorLocationSenderComponent self, long id)
  45. {
  46. if (id == 0)
  47. {
  48. throw new Exception($"actor id is 0");
  49. }
  50. if (self.Children.TryGetValue(id, out Entity actorLocationSender))
  51. {
  52. return (ActorLocationSender)actorLocationSender;
  53. }
  54. actorLocationSender = EntityFactory.CreateWithId<ActorLocationSender>(self.Domain, id);
  55. actorLocationSender.Parent = self;
  56. return (ActorLocationSender)actorLocationSender;
  57. }
  58. private static void Remove(this ActorLocationSenderComponent self, long id)
  59. {
  60. if (!self.Children.TryGetValue(id, out Entity actorMessageSender))
  61. {
  62. return;
  63. }
  64. actorMessageSender.Dispose();
  65. }
  66. public static void Send(this ActorLocationSenderComponent self, long entityId, IActorLocationMessage message)
  67. {
  68. ActorLocationSender actorLocationSender = self.Get(entityId);
  69. actorLocationSender.Send(message);
  70. }
  71. public static async ETTask<IActorResponse> Call(this ActorLocationSenderComponent self, long entityId, IActorLocationRequest message)
  72. {
  73. ActorLocationSender actorLocationSender = self.Get(entityId);
  74. return await actorLocationSender.Call(message);
  75. }
  76. }
  77. }