TaskItem.cs 8.3 KB

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