|
@@ -3,6 +3,7 @@ using System.Threading;
|
|
|
using Quadarax.Foundation.Core.Business.Processor.Enums;
|
|
using Quadarax.Foundation.Core.Business.Processor.Enums;
|
|
|
using Quadarax.Foundation.Core.Business.Processor.Exceptons;
|
|
using Quadarax.Foundation.Core.Business.Processor.Exceptons;
|
|
|
using Quadarax.Foundation.Core.Business.Processor.Queue;
|
|
using Quadarax.Foundation.Core.Business.Processor.Queue;
|
|
|
|
|
+using Quadarax.Foundation.Core.Data;
|
|
|
using Quadarax.Foundation.Core.Logging;
|
|
using Quadarax.Foundation.Core.Logging;
|
|
|
using Quadarax.Foundation.Core.Object;
|
|
using Quadarax.Foundation.Core.Object;
|
|
|
using Quadarax.Foundation.Core.Value.Extensions;
|
|
using Quadarax.Foundation.Core.Value.Extensions;
|
|
@@ -104,7 +105,7 @@ namespace Quadarax.Foundation.Core.Business.Processor.Task
|
|
|
this(parent, reference, source, initialArguments, priority, attepts, attemptTimeout, validFrom, validTo, initialStatusLog)
|
|
this(parent, reference, source, initialArguments, priority, attepts, attemptTimeout, validFrom, validTo, initialStatusLog)
|
|
|
{
|
|
{
|
|
|
Id = id;
|
|
Id = id;
|
|
|
- Status = initialStatus;
|
|
|
|
|
|
|
+ SetStatus(initialStatus, "(System) Initialization");
|
|
|
}
|
|
}
|
|
|
public TaskItem(ProcessQueue parent, string reference, string providerClass, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog)
|
|
public TaskItem(ProcessQueue parent, string reference, string providerClass, TypedArgument[] initialArguments, byte priority, int attepts, TimeSpan? attemptTimeout, DateTime validFrom, DateTime? validTo, ITaskStatusLogItem[]? initialStatusLog)
|
|
|
{
|
|
{
|
|
@@ -123,7 +124,7 @@ namespace Quadarax.Foundation.Core.Business.Processor.Task
|
|
|
Created = DateTime.Now;
|
|
Created = DateTime.Now;
|
|
|
if (initialStatusLog != null)
|
|
if (initialStatusLog != null)
|
|
|
_statusLog.Setup(initialStatusLog);
|
|
_statusLog.Setup(initialStatusLog);
|
|
|
- Status = ProcessStatusEnum.Pending;
|
|
|
|
|
|
|
+ SetStatus(ProcessStatusEnum.Pending, "(System) Initialization");
|
|
|
Id = long.MinValue;
|
|
Id = long.MinValue;
|
|
|
}
|
|
}
|
|
|
#endregion
|
|
#endregion
|
|
@@ -226,9 +227,37 @@ namespace Quadarax.Foundation.Core.Business.Processor.Task
|
|
|
|
|
|
|
|
internal void SetStatus(ProcessStatusEnum status, string reason)
|
|
internal void SetStatus(ProcessStatusEnum status, string reason)
|
|
|
{
|
|
{
|
|
|
- if (status == Status) return;
|
|
|
|
|
|
|
+ if (status == Status)
|
|
|
|
|
+ {
|
|
|
|
|
+ var log = _statusLog.Where(x => x.Status == status).MaxBy(x => x.Created);
|
|
|
|
|
+ if (log == null) throw new InvalidOperationException($"Inconsistent task state. Status log must not be empty for status '{status}'.");
|
|
|
|
|
+ if (log.Reason != reason)
|
|
|
|
|
+ {
|
|
|
|
|
+ ((TaskStatusLogItem)log).Reason = reason;
|
|
|
|
|
+ Changed = DateTime.Now;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ _statusLog.Add(new TaskStatusLogItem(status, reason));
|
|
|
|
|
+
|
|
|
|
|
+ switch (status)
|
|
|
|
|
+ {
|
|
|
|
|
+ case ProcessStatusEnum.Initial:
|
|
|
|
|
+ Created = DateTime.Now;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case ProcessStatusEnum.Started:
|
|
|
|
|
+ StatStarted = DateTime.Now;
|
|
|
|
|
+ break;
|
|
|
|
|
+ case ProcessStatusEnum.ProcessedFail:
|
|
|
|
|
+ case ProcessStatusEnum.ProcessedSucc:
|
|
|
|
|
+ case ProcessStatusEnum.ExpiredAttemts:
|
|
|
|
|
+ case ProcessStatusEnum.ExpiredValidity:
|
|
|
|
|
+ case ProcessStatusEnum.Failed:
|
|
|
|
|
+ StatFinished = DateTime.Now;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- _statusLog.Add(new TaskStatusLogItem(Status, reason));
|
|
|
|
|
Status = status;
|
|
Status = status;
|
|
|
Changed = DateTime.Now;
|
|
Changed = DateTime.Now;
|
|
|
}
|
|
}
|
|
@@ -312,13 +341,21 @@ namespace Quadarax.Foundation.Core.Business.Processor.Task
|
|
|
|
|
|
|
|
private void Execute(object? state)
|
|
private void Execute(object? state)
|
|
|
{
|
|
{
|
|
|
- if (state==null) throw new ArgumentNullException(nameof(state));
|
|
|
|
|
- var token = (CancellationTokenSource)state;
|
|
|
|
|
|
|
+ try
|
|
|
|
|
+ {
|
|
|
|
|
+ if (state==null) throw new ArgumentNullException(nameof(state));
|
|
|
|
|
+ var token = (CancellationTokenSource)state;
|
|
|
|
|
|
|
|
- SetStatus(ProcessStatusEnum.Started, $"(System) Task started with attempt #{(InitialAttempts - AttemptsLeft) + 1}");
|
|
|
|
|
- StatStarted = DateTime.Now;
|
|
|
|
|
- _parent.Provider.Set(this);
|
|
|
|
|
|
|
+ SetStatus(ProcessStatusEnum.Started, $"(System) Task started with attempt #{(InitialAttempts - AttemptsLeft) + 1}");
|
|
|
|
|
+ StatStarted = DateTime.Now;
|
|
|
|
|
+ _parent.Provider.Set(this);
|
|
|
|
|
|
|
|
|
|
+ }
|
|
|
|
|
+ catch (Exception e)
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|