AutomaticRestartEntryPoint.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using MediaBrowser.Common.ScheduledTasks;
  2. using MediaBrowser.Controller;
  3. using MediaBrowser.Controller.Plugins;
  4. using MediaBrowser.Controller.Session;
  5. using MediaBrowser.Model.Logging;
  6. using MediaBrowser.Model.Tasks;
  7. using System;
  8. using System.Linq;
  9. using System.Threading;
  10. namespace MediaBrowser.Server.Implementations.EntryPoints
  11. {
  12. public class AutomaticRestartEntryPoint : IServerEntryPoint
  13. {
  14. private readonly IServerApplicationHost _appHost;
  15. private readonly ILogger _logger;
  16. private readonly ITaskManager _iTaskManager;
  17. private readonly ISessionManager _sessionManager;
  18. private Timer _timer;
  19. public AutomaticRestartEntryPoint(IServerApplicationHost appHost, ILogger logger, ITaskManager iTaskManager, ISessionManager sessionManager)
  20. {
  21. _appHost = appHost;
  22. _logger = logger;
  23. _iTaskManager = iTaskManager;
  24. _sessionManager = sessionManager;
  25. }
  26. public void Run()
  27. {
  28. if (_appHost.CanSelfRestart)
  29. {
  30. _appHost.HasPendingRestartChanged += _appHost_HasPendingRestartChanged;
  31. }
  32. }
  33. void _appHost_HasPendingRestartChanged(object sender, EventArgs e)
  34. {
  35. DisposeTimer();
  36. if (_appHost.HasPendingRestart)
  37. {
  38. _timer = new Timer(TimerCallback, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
  39. }
  40. }
  41. private void TimerCallback(object state)
  42. {
  43. if (IsIdle())
  44. {
  45. DisposeTimer();
  46. try
  47. {
  48. _appHost.Restart();
  49. }
  50. catch (Exception ex)
  51. {
  52. _logger.ErrorException("Error restarting server", ex);
  53. }
  54. }
  55. }
  56. private bool IsIdle()
  57. {
  58. if (_iTaskManager.ScheduledTasks.Any(i => i.State != TaskState.Idle))
  59. {
  60. return false;
  61. }
  62. var now = DateTime.UtcNow;
  63. if (_sessionManager.Sessions.Any(i => !string.IsNullOrEmpty(i.NowViewingItemName) || (now - i.LastActivityDate).TotalMinutes < 30))
  64. {
  65. return false;
  66. }
  67. return true;
  68. }
  69. public void Dispose()
  70. {
  71. _appHost.HasPendingRestartChanged -= _appHost_HasPendingRestartChanged;
  72. DisposeTimer();
  73. }
  74. private void DisposeTimer()
  75. {
  76. if (_timer != null)
  77. {
  78. _timer.Dispose();
  79. _timer = null;
  80. }
  81. }
  82. }
  83. }