TaskItem.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  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. AffinityToken = null;
  97. _parent = parent ?? throw new ArgumentNullException(nameof(parent));
  98. _log = new ConsoleLogger().GetLogger(GetType());
  99. Priority = priority;
  100. Reference = reference;
  101. ProviderClass = providerClass;
  102. Arguments.Setup(initialArguments);
  103. AttemptTimeout = attemptTimeout;
  104. AttemptsLeft = attepts;
  105. ProcessingValidFrom = validFrom;
  106. ProcessingValidTo = validTo;
  107. Created = DateTime.Now;
  108. if (initialStatusLog != null)
  109. _statusLog.Setup(initialStatusLog);
  110. Status = ProcessStatusEnum.Pending;
  111. Id = long.MinValue;
  112. }
  113. #endregion
  114. #region *** Public Operations ***
  115. public void Postpone(TimeSpan postponeInterval, string reason)
  116. {
  117. throw new NotImplementedException();
  118. }
  119. public void Stop(string reason, bool willPause = true, bool willFail = false)
  120. {
  121. throw new NotImplementedException();
  122. }
  123. public void Reset(string reason, TimeSpan postponeValid)
  124. {
  125. throw new NotImplementedException();
  126. }
  127. public void Delete(string reason, bool immediate = false)
  128. {
  129. throw new NotImplementedException();
  130. }
  131. public bool Euqals(ITaskItemData data)
  132. {
  133. return ((ITaskItemData)this).Equals(data);
  134. }
  135. #endregion
  136. #region *** Internal Operations ***
  137. internal void CopyFrom(ITaskItemData data)
  138. {
  139. Id = data.Id;
  140. Status = data.Status;
  141. Changed = data.Changed;
  142. Reference = data.Reference;
  143. ProviderClass = data.ProviderClass;
  144. Priority = data.Priority;
  145. ProcessingValidFrom = data.ProcessingValidFrom;
  146. ProcessingValidTo = data.ProcessingValidTo;
  147. Created = data.Created;
  148. Changed = data.Changed;
  149. StatStarted = data.StatStarted;
  150. StatFinished = data.StatFinished;
  151. StatLastAttemptDuration = data.StatLastAttemptDuration;
  152. AttemptsLeft = data.AttemptsLeft;
  153. AttemptTimeout = data.AttemptTimeout;
  154. _statusLog.Clear();
  155. _statusLog.AddRange(data.StatusLog);
  156. _arguments.Clear();
  157. _arguments.AddRange(data.Arguments);
  158. }
  159. bool IEquatable<ITaskItemData>.Equals(ITaskItemData? other)
  160. {
  161. if (other == null)
  162. return false;
  163. var result = Id == other.Id &&
  164. Status == other.Status &&
  165. Changed == other.Changed &&
  166. Reference == other.Reference &&
  167. ProviderClass == other.ProviderClass &&
  168. Priority == other.Priority &&
  169. ProcessingValidFrom == other.ProcessingValidFrom &&
  170. ProcessingValidTo == other.ProcessingValidTo &&
  171. Created == other.Created &&
  172. Changed == other.Changed &&
  173. StatStarted == other.StatStarted &&
  174. StatFinished == other.StatFinished &&
  175. StatLastAttemptDuration == other.StatLastAttemptDuration &&
  176. AttemptsLeft == other.AttemptsLeft &&
  177. AttemptTimeout == other.AttemptTimeout &&
  178. _statusLog.SequenceEqual(other.StatusLog) &&
  179. _arguments.SequenceEqual(other.Arguments);
  180. return result;
  181. }
  182. #endregion
  183. }
  184. }