TaskItem.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. using Quadarax.Foundation.Core.Business.Processor.Enums;
  2. using Quadarax.Foundation.Core.Business.Processor.Queue;
  3. using Quadarax.Foundation.Core.Logging;
  4. using Quadarax.Foundation.Core.Object;
  5. using Quadarax.Foundation.Core.Value.Extensions;
  6. namespace Quadarax.Foundation.Core.Business.Processor.Task
  7. {
  8. internal class TaskItem : ITaskItem
  9. {
  10. #region *** Properties ***
  11. /// <summary>
  12. /// <inheritdoc cref="ITaskItem.Id"/>
  13. /// </summary>
  14. public long Id { get; internal set; }
  15. /// <summary>
  16. /// <inheritdoc cref="ITaskItem.QueueType"/>
  17. /// </summary>
  18. public ProcessQueueTypeEnum QueueType { get;private set; }
  19. /// <summary>
  20. /// <inheritdoc cref="ITaskItem.Created"/>
  21. /// </summary>
  22. public DateTime Created { get; private set;}
  23. /// <summary>
  24. /// <inheritdoc cref="ITaskItem.Changed"/>
  25. /// </summary>
  26. public DateTime? Changed { get; private set;}
  27. /// <summary>
  28. /// <inheritdoc cref="ITaskItem.AffinityToken"/>
  29. /// </summary>
  30. public IAffinityToken AffinityToken { get; private set;}
  31. /// <summary>
  32. /// <inheritdoc cref="ITaskItem.Reference"/>
  33. /// </summary>
  34. public string Reference { get; private set;}
  35. /// <summary>
  36. /// <inheritdoc cref="ITaskItem.Status"/>
  37. /// </summary>
  38. public ProcessStatusEnum Status { get; private set; }
  39. /// <summary>
  40. /// <inheritdoc cref="ITaskItem.ProviderClass"/>
  41. /// </summary>
  42. public string ProviderClass { get; private set;}
  43. /// <summary>
  44. /// <inheritdoc cref="ITaskItem.Priority"/>
  45. /// </summary>
  46. public byte Priority { get; private set;}
  47. /// <summary>
  48. /// <inheritdoc cref="ITaskItem.ProcessingValidFrom"/>
  49. /// </summary>
  50. public DateTime ProcessingValidFrom { get;private set; }
  51. /// <summary>
  52. /// <inheritdoc cref="ITaskItem.ProcessingValidTo"/>
  53. /// </summary>
  54. public DateTime? ProcessingValidTo { get; private set;}
  55. /// <summary>
  56. /// <inheritdoc cref="ITaskItem.AttemptsLeft"/>
  57. /// </summary>
  58. public int AttemptsLeft { get; private set;}
  59. /// <summary>
  60. /// <inheritdoc cref="ITaskItem.AttemptTimeout"/>
  61. /// </summary>
  62. public TimeSpan? AttemptTimeout { get; private set;}
  63. /// <summary>
  64. /// <inheritdoc cref="ITaskItem.StatStarted"/>
  65. /// </summary>
  66. public DateTime StatStarted { get; private set;}
  67. /// <summary>
  68. /// <inheritdoc cref="ITaskItem.StatFinished"/>
  69. /// </summary>
  70. public DateTime StatFinished { get; private set;}
  71. /// <summary>
  72. /// <inheritdoc cref="ITaskItem.StatLastAttemptDuration"/>
  73. /// </summary>
  74. public TimeSpan StatLastAttemptDuration { get; private set;}
  75. /// <summary>
  76. /// <inheritdoc cref="ITaskItem.StatusLog"/>
  77. /// </summary>
  78. public ITaskStatusLogItem[] StatusLog => _statusLog.ToArray();
  79. public TypedArgument[] Arguments => _arguments.ToArray();
  80. #endregion
  81. #region *** Private Fields ***
  82. private readonly List<ITaskStatusLogItem> _statusLog = new();
  83. private readonly List<TypedArgument> _arguments = new();
  84. private ILog _log;
  85. private ProcessQueue _parent;
  86. #endregion
  87. #region *** Constructors ***
  88. private TaskItem(ProcessQueue parent, long id, ProcessStatusEnum initialStatus, string reference, string source, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog):
  89. this(parent, reference, source, initialArguments, priority, attepts, attemptTimeout, validFrom, validTo, initialStatusLog)
  90. {
  91. Id = id;
  92. Status = initialStatus;
  93. }
  94. public TaskItem(ProcessQueue parent, string reference, string providerClass, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog)
  95. {
  96. _parent = parent ?? throw new ArgumentNullException(nameof(parent));
  97. _log = new ConsoleLogger().GetLogger(GetType());
  98. Priority = priority;
  99. Reference = reference;
  100. ProviderClass = providerClass;
  101. Arguments.Setup(initialArguments);
  102. AttemptTimeout = attemptTimeout;
  103. AttemptsLeft = attepts;
  104. ProcessingValidFrom = validFrom;
  105. ProcessingValidTo = validTo;
  106. Created = DateTime.Now;
  107. if (initialStatusLog != null)
  108. _statusLog.Setup(initialStatusLog);
  109. Status = ProcessStatusEnum.Pending;
  110. Id = long.MinValue;
  111. }
  112. #endregion
  113. #region *** Public Operations ***
  114. public void Postpone(TimeSpan postponeInterval, string reason)
  115. {
  116. throw new NotImplementedException();
  117. }
  118. public void Stop(string reason, bool willPause = true, bool willFail = false)
  119. {
  120. throw new NotImplementedException();
  121. }
  122. public void Reset(string reason, TimeSpan postponeValid)
  123. {
  124. throw new NotImplementedException();
  125. }
  126. public void Delete(string reason, bool immediate = false)
  127. {
  128. throw new NotImplementedException();
  129. }
  130. public bool Euqals(ITaskItemData data)
  131. {
  132. return ((ITaskItemData)this).Equals(data);
  133. }
  134. #endregion
  135. #region *** Internal Operations ***
  136. internal void CopyFrom(ITaskItemData data)
  137. {
  138. Id = data.Id;
  139. Status = data.Status;
  140. Changed = data.Changed;
  141. Reference = data.Reference;
  142. ProviderClass = data.ProviderClass;
  143. Priority = data.Priority;
  144. ProcessingValidFrom = data.ProcessingValidFrom;
  145. ProcessingValidTo = data.ProcessingValidTo;
  146. Created = data.Created;
  147. Changed = data.Changed;
  148. StatStarted = data.StatStarted;
  149. StatFinished = data.StatFinished;
  150. StatLastAttemptDuration = data.StatLastAttemptDuration;
  151. AttemptsLeft = data.AttemptsLeft;
  152. AttemptTimeout = data.AttemptTimeout;
  153. _statusLog.Clear();
  154. _statusLog.AddRange(data.StatusLog);
  155. _arguments.Clear();
  156. _arguments.AddRange(data.Arguments);
  157. }
  158. bool IEquatable<ITaskItemData>.Equals(ITaskItemData? other)
  159. {
  160. if (other == null)
  161. return false;
  162. var result = Id == other.Id &&
  163. Status == other.Status &&
  164. Changed == other.Changed &&
  165. Reference == other.Reference &&
  166. ProviderClass == other.ProviderClass &&
  167. Priority == other.Priority &&
  168. ProcessingValidFrom == other.ProcessingValidFrom &&
  169. ProcessingValidTo == other.ProcessingValidTo &&
  170. Created == other.Created &&
  171. Changed == other.Changed &&
  172. StatStarted == other.StatStarted &&
  173. StatFinished == other.StatFinished &&
  174. StatLastAttemptDuration == other.StatLastAttemptDuration &&
  175. AttemptsLeft == other.AttemptsLeft &&
  176. AttemptTimeout == other.AttemptTimeout &&
  177. _statusLog.SequenceEqual(other.StatusLog) &&
  178. _arguments.SequenceEqual(other.Arguments);
  179. return result;
  180. }
  181. #endregion
  182. }
  183. }