Scheduler.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using Comal.Classes;
  2. using InABox.Clients;
  3. using InABox.Core;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Timers;
  8. namespace Comal.TaskScheduler.Shared
  9. {
  10. public class Scheduler
  11. {
  12. private Timer timer;
  13. public TimeSpan Interval { get; set; }
  14. public Scheduler()
  15. {
  16. CoreUtils.RegisterClasses();
  17. ComalUtils.RegisterClasses();
  18. // Set the Interval to 1 minute
  19. Interval = new TimeSpan(0, 1, 0);
  20. timer = new System.Timers.Timer(Interval.TotalMilliseconds);
  21. timer.Elapsed += new ElapsedEventHandler(CheckSchedules);
  22. }
  23. public void Start()
  24. {
  25. DoCheckSchedules();
  26. }
  27. public void Stop()
  28. {
  29. timer.Enabled = false;
  30. }
  31. private object? GetEntity(Type type, Guid id)
  32. {
  33. if (type == typeof(Equipment))
  34. return new Client<Equipment>().Load(new Filter<Equipment>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  35. else if (type == typeof(Customer))
  36. return new Client<Customer>().Load(new Filter<Customer>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  37. else if (type == typeof(Employee))
  38. return new Client<Employee>().Load(new Filter<Employee>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  39. else if (type == typeof(CustomModule))
  40. return new Client<CustomModule>().Load(new Filter<CustomModule>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  41. else if (type == typeof(ScheduledScript))
  42. return new Client<ScheduledScript>().Load(new Filter<ScheduledScript>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
  43. return null;
  44. //var type = schedule.DocumentType;
  45. //IClient client = ClientFactory.CreateClient(type);
  46. //var filter = new Filter<Entity>(x => x.ID).IsEqualTo(schedule.DocumentID);
  47. //Entity entity = client.Load(filter).FirstOrDefault();
  48. //var item = entity as ISchedulable;
  49. }
  50. private void DoCheckSchedules()
  51. {
  52. timer.Enabled = false;
  53. Logger.Send(LogType.Information, ClientFactory.UserID, "Checking Schedules");
  54. var scheduleClient = new Client<Schedule>();
  55. try
  56. {
  57. Schedule[] schedules = scheduleClient.Load(
  58. new Filter<Schedule>(x => x.DocumentClass).IsNotEqualTo("")
  59. .And(x => x.DocumentID).IsNotEqualTo(Guid.Empty)
  60. .And(x => x.Active).IsEqualTo(true) //.And(x => x.DueDate).IsLessThan(DateTime.Now)
  61. );
  62. EmployeeRole[] EmployeeRoles = new Client<EmployeeRole>().Load();
  63. var cache = new Dictionary<string, Entity[]>();
  64. for (int i = 0; i < schedules.Length; i++)
  65. {
  66. Schedule schedule = schedules[i];
  67. if ((schedule.DocumentClass != "") && (schedule.DocumentID != Guid.Empty))
  68. {
  69. ISchedulePlugin? plugin = SchedulePluginFactory.GetPlugin(schedule.DocumentClass);
  70. if(plugin == null)
  71. {
  72. Logger.Send(LogType.Error, ClientFactory.UserID, $"No plugin for {schedule.DocumentClass}");
  73. continue;
  74. }
  75. //var entity = plugin.LoadEntity(schedule.DocumentID);
  76. if (!cache.ContainsKey(schedule.DocumentClass))
  77. {
  78. Guid[] ids = schedules.Where(x => x.DocumentClass.Equals(schedule.DocumentClass)).Select(x => x.DocumentID).ToArray();
  79. cache[schedule.DocumentClass] = plugin.LoadEntities(ids);
  80. }
  81. var entities = cache[schedule.DocumentClass];
  82. var entity = entities.FirstOrDefault(x => x.ID.Equals(schedule.DocumentID));
  83. if (entity != null)
  84. {
  85. Logger.Send(LogType.Information, ClientFactory.UserID, $"- {entity} - {schedule.Title}");
  86. try
  87. {
  88. if (!plugin.Execute(schedule, entity))
  89. Logger.Send(LogType.Information, ClientFactory.UserID, " * Schedule not yet due");
  90. }
  91. catch (Exception e)
  92. {
  93. Logger.Send(LogType.Information, ClientFactory.UserID, $" * Exception while processing schedule: {e.Message}\n" + String.Join("\n",e.StackTrace));
  94. }
  95. }
  96. else
  97. Logger.Send(LogType.Information, ClientFactory.UserID, $"- {schedule.Title}: cannot find linked entity({schedule.DocumentClass})");
  98. }
  99. }
  100. }
  101. catch (Exception err)
  102. {
  103. Logger.Send(LogType.Information, ClientFactory.UserID, err.Message + "\r\n" + err.StackTrace);
  104. }
  105. GC.Collect();
  106. GC.WaitForPendingFinalizers();
  107. GC.Collect();
  108. timer.Enabled = true;
  109. }
  110. private void CheckSchedules(object source, ElapsedEventArgs e)
  111. {
  112. DoCheckSchedules();
  113. }
  114. }
  115. }