HeartBeatTimeoutComponentSystem.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. namespace ET.Server
  3. {
  4. [Invoke(TimerInvokeType.HeartBeatTimeout)]
  5. public class HeartBeatCheck: ATimer<HeartBeatTimeoutComponent>
  6. {
  7. protected override void Run(HeartBeatTimeoutComponent self)
  8. {
  9. try
  10. {
  11. self.Check();
  12. }
  13. catch (Exception e)
  14. {
  15. Log.Error($"move timer error: {self.Id}\n{e}");
  16. }
  17. }
  18. }
  19. [ObjectSystem]
  20. public class HeartBeatTimeoutComponentAwakeSystem: AwakeSystem<HeartBeatTimeoutComponent>
  21. {
  22. protected override void Awake(HeartBeatTimeoutComponent self)
  23. {
  24. self.Timer = TimerComponent.Instance.NewRepeatedTimer( Math.Max( ConstValue.HeartBeatTimeoutTime, 5 ), TimerInvokeType.HeartBeatTimeout, self);
  25. }
  26. }
  27. [ObjectSystem]
  28. public class HeartBeatTimeoutComponentDestroySystem: DestroySystem<HeartBeatTimeoutComponent>
  29. {
  30. protected override void Destroy(HeartBeatTimeoutComponent self)
  31. {
  32. TimerComponent.Instance?.Remove(ref self.Timer);
  33. }
  34. }
  35. public static class HeartBeatTimeoutComponentSystem
  36. {
  37. public static void Check(this HeartBeatTimeoutComponent self)
  38. {
  39. Session session = self.GetParent<Session>();
  40. long timeNow = TimeHelper.ClientNow();
  41. if (session.LastPingTime == 0 || timeNow - session.LastPingTime < ConstValue.HeartBeatTimeoutTime)
  42. {
  43. return;
  44. }
  45. Log.Info($"heartBeat timeout: {session.Id} {timeNow} {session.LastPingTime} {timeNow - session.LastPingTime}");
  46. session.Error = ErrorCore.ERR_HeartBeatTimeout;
  47. session.Dispose();
  48. }
  49. }
  50. }