Example #1
0
 public void Execute(IEngineTask task)
 {
     if (CanExecute(task))
     {
         enginePipeline.Produce(task);
     }
 }
        public async Task ProcessActionTask(IEngineTask task)
        {
            var lockTask    = task as LockTask;
            var processItem = await _processItemEventStore.GetProcessItemAsync(lockTask.ProcessItemId);

            _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem);
            _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem);

            processItem.ApplyMutation(new LockProcessItemMutation()
            {
                LockDuration = TimeSpan.FromMinutes(5),
                PrincipalId  = task.PrincipalId
            });
            _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                         (processItemMutationId, mutationDateTimeUtc) =>
            {
                processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
            });

            _eventQueue.PublishEvent(new EventNotification()
            {
                ProcessItemId    = lockTask.ProcessItemId,
                NotificationKind = EventNotificationKinds.ProcessItemLock
            });
        }
Example #3
0
        private async Task InvokeAction(IEngineTask task)
        {
            try
            {
                var taskHandler = _taskHandlerFactory(task.GetType().Name);
                await taskHandler.ProcessActionTask(task);
            }
            catch (Exception e)
            {
                // global exception handler for tasks
                _loggingAdapter.WriteEntry(new LogEntry(LoggingEventType.Error, "We threw an exception! {exception}", new  Dictionary <string, object>()
                {
                    { "exception", e },
                }));

                _eventQueue.PublishEvent(new EventNotification()
                {
                    ProcessId        = (task as IProcessEngineTask)?.ProcessId,
                    ProcessItemId    = (task as IProcessItemEngineTask)?.ProcessItemId,
                    ActionId         = (task as IActionTask)?.ActionId,
                    PrincipalId      = task.PrincipalId,
                    NotificationKind = EventNotificationKinds.Exception,
                    Exception        = e
                });
            }
        }
Example #4
0
        public async Task ProcessActionTask(IEngineTask task)
        {
            var unlockTask  = task as UnlockTask;
            var processItem = await _processItemEventStore.GetProcessItemAsync(unlockTask.ProcessItemId);

            _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem);
            _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem);

            if (String.IsNullOrWhiteSpace(processItem.Lock?.LockedToPrincipalId) || processItem.Lock?.LockExpirationUtc < DateTime.UtcNow)
            {
                // the current user doesn't have a valid lock.  There's no reason to apply any mutation.
                return;
            }

            processItem.ApplyMutation(new UnlockProcessItemMutation()
            {
            });
            _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                         (processItemMutationId, mutationDateTimeUtc) =>
            {
                processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
            });

            _eventQueue.PublishEvent(new EventNotification()
            {
                ProcessItemId    = unlockTask.ProcessItemId,
                NotificationKind = EventNotificationKinds.ProcessItemUnlock
            });
        }
Example #5
0
        /// <summary>
        /// Executes the task.
        /// </summary>
        /// <param name="task">The task.</param>
        /// <exception cref="NotImplementedException"></exception>
        public void ExecuteTask(IEngineTask task)
        {
            // Check if task can be executed
            if (!task.CanBeExecuted())
            {
                task.AddMessage($"The task cannot be executed.", MessageSeverity.Error);
                if (task.ParentJob.FailIfAnyTaskHasError)
                {
                    throw new EngineException(logger, $"The task  cannot be executed. This job was aborted.");
                }
                else
                {
                    return;
                }
            }

            // Execute task
            if (TaskStarted != null)
            {
                TaskStarted.Invoke((Guid)task.EntityId, (Guid)task.InstanceID);
            }
            task.Start();

            // Stop task
            task.Stop();


            if (task.HasErrors)
            {
                task.AddMessage($"The task (instance: {task.InstanceID}) was not executed cause one or more errors occurs.", MessageSeverity.Error);
                if (task.ParentJob.FailIfAnyTaskHasError)
                {
                    if (TaskFinished != null)
                    {
                        TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, false);
                    }

                    throw new EngineException(logger, $"The task (instance: {task.InstanceID}) was not executed cause one or more errors occurs. This job was aborted.");
                }
            }
            else if (task.HasWarnings)
            {
                task.AddMessage($"The task (instance: {task.InstanceID}) was executed but one or more warning occurs.", MessageSeverity.Warning);
                if (task.ParentJob.FailIfAnyTaskHasWarning)
                {
                    if (TaskFinished != null)
                    {
                        TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, false);
                    }

                    throw new EngineException(logger, $"The task (instance: {task.InstanceID}) was executed but one or more warning occurs. This job was aborted.");
                }
            }
            if (TaskFinished != null)
            {
                TaskFinished.Invoke((Guid)task.EntityId, (Guid)task.InstanceID, true);
            }
        }
Example #6
0
 public void Enqueue(IEngineTask task)
 {
     _loggingAdapter.WriteEntry(new LogEntry(LoggingEventType.Information, "Enqueuing task: {task}",
                                             new Dictionary <string, object>()
     {
         { "task", JsonConvert.SerializeObject(task) }
     }));
     Queue.Enqueue(task);
 }
 /// <summary>
 /// Process the specified task.  It will be processed either now,
 /// or queued to process on the thread pool.
 /// </summary>
 /// <param name="task">The task to process.</param>
 /// <param name="group">The group this task belongs to.</param>
 public void ProcessTask(IEngineTask task, TaskGroup group)
 {
     lock (this)
     {
         _activeTasks++;
     }
     if (group != null)
         group.TaskStarting();
     var item = new PoolItem(this, task, group);
     ThreadPool.QueueUserWorkItem(item.ThreadPoolCallback);
 }
 public void Validate(IEngineTask task, IProcessItem processItem)
 {
     if (processItem.Lock == null || processItem.Lock.LockExpirationUtc < DateTime.UtcNow)
     {
         return;
     }
     if (!Equals(processItem.Lock.LockedToPrincipalId, task.PrincipalId))
     {
         throw new ProcessItemLockedException(processItem.ProcessItemId, task.PrincipalId, processItem.Lock.LockExpirationUtc);
     }
 }
Example #9
0
 public void Validate(IEngineTask task, IProcessItem processItem)
 {
     if (!(task is IActionTask actionTask))
     {
         // don't validate a non-action task
         return;
     }
     if (!actionTask.ExpectedLastMutationId.Equals(processItem.ItemState?.ProcessItemMutationId))
     {
         throw new ProcessItemStateChangedException(processItem.ProcessItemId, actionTask.ExpectedLastMutationId, processItem.ItemState.ProcessItemMutationId);
     }
 }
Example #10
0
        /// <summary>
        /// Process the specified task.  It will be processed either now,
        /// or queued to process on the thread pool.
        /// </summary>
        /// <param name="task">The task to process.</param>
        /// <param name="group">The group this task belongs to.</param>
        public void ProcessTask(IEngineTask task, TaskGroup group)
        {
            lock (this)
            {
                _activeTasks++;
            }
            if (group != null)
            {
                group.TaskStarting();
            }
            var item = new PoolItem(this, task, group);

            ThreadPool.QueueUserWorkItem(item.ThreadPoolCallback);
        }
Example #11
0
        public bool TryDequeueNext(out IEngineTask task)
        {
            var success = Queue.TryDequeue(out task);

            if (success)
            {
                _loggingAdapter.WriteEntry(new LogEntry(LoggingEventType.Information, "Dequeuing task: {task}",
                                                        new Dictionary <string, object>()
                {
                    { "task", JsonConvert.SerializeObject(task) }
                }));
            }
            //else
            //{
            //	_loggingAdapter.WriteEntry(
            //		new LogEntry(LoggingEventType.Information, "Attempt to dequeue task found no tasks."));
            //}
            return(success);
        }
Example #12
0
        private bool CanExecute(IEngineTask task)
        {
            bool doProduce = true;

            lock (firstLoadSyncRoot)
            {
                doProduce = allFirstLoadsDone;

                if (!doProduce && task.DirtyNode.Node is IActiveNode)
                {
                    if (--countOfFirstLoadsOutstanding == 0)
                    {
                        doProduce = allFirstLoadsDone = true;
                    }
                }
            }

            return(doProduce);
        }
Example #13
0
 public void Execute(IEngineTask task)
 {
     if (CanExecute(task))
     {
         enginePipeline.Produce(task);
     }
 }
Example #14
0
 /// <summary>
 /// Construct a pool item.
 /// </summary>
 /// <param name="owner">The owner of this task.</param>
 /// <param name="task">The task to execute.</param>
 /// <param name="group">The group that this task belongs to.</param>
 public PoolItem(EngineConcurrency owner, IEngineTask task,  TaskGroup group)
 {
     this.owner = owner;
     this.task = task;
     this.group = group;
 }
Example #15
0
        private bool CanExecute(IEngineTask task)
        {
            bool doProduce = true;

            lock (firstLoadSyncRoot)
            {
                doProduce = allFirstLoadsDone;

                if (!doProduce && task.DirtyNode.Node is IActiveNode)
                {
                    if (--countOfFirstLoadsOutstanding == 0)
                    {
                        doProduce = allFirstLoadsDone = true;
                    }
                }
            }

            return doProduce;
        }
Example #16
0
 public void ProcessTask(IEngineTask task, TaskGroup group)
 {
     lock (this)
     {
         this._x16f1ed41ac673568++;
         if (group != null)
         {
             group.TaskStarting();
             if (0 != 0)
             {
                 return;
             }
         }
     }
     PoolItem item = new PoolItem(this, task, group);
     ThreadPool.QueueUserWorkItem(new WaitCallback(item.ThreadPoolCallback));
 }
Example #17
0
 /// <summary>
 /// Process the specified task.  It will be processed either now,
 /// or queued to process on the thread pool.  No group is assigned.
 /// </summary>
 /// <param name="task">The task to process.</param>
 public void ProcessTask(IEngineTask task)
 {
     ProcessTask(task, null);
 }
Example #18
0
 /// <summary>
 /// Process the specified task.  It will be processed either now,
 /// or queued to process on the thread pool.  No group is assigned.
 /// </summary>
 /// <param name="task">The task to process.</param>
 public void ProcessTask(IEngineTask task)
 {
     ProcessTask(task, null);
 }
Example #19
0
        public async Task ProcessActionTask(IEngineTask task)
        {
            var actionTask = task as ActionTask;
            var process    = await _processStore.GetProcessAsync(actionTask.ProcessId);

            var processItem = await _processItemEventStore.GetProcessItemAsync(actionTask.ProcessItemId);

            if (processItem == null)
            {
                var action = process.StartActions[actionTask.ActionId];
                if (action == null)
                {
                    throw new Exception("Start action not found, and process item is null.");
                }

                processItem = new ProcessItem();
                processItem.ApplyMutation(new CreationActionProcessItemMutation()
                {
                    ProcessItemId   = actionTask.ProcessItemId,
                    ActionId        = actionTask.ActionId,
                    TargetStepId    = action.ArrivalStep,
                    PropertyChanges = actionTask.PropertyChanges
                });
                _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                             (processItemMutationId, mutationDateTimeUtc) =>
                {
                    processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
                });
            }
            else
            {
                _taskValidatorFactory(EngineTaskValidatorKinds.CurrentUserCanLockProcessItem).Validate(task, processItem);
                _taskValidatorFactory(EngineTaskValidatorKinds.RequestIsForTheMostRecentState).Validate(task, processItem);

                if (process.Steps.TryGetValue(processItem.CurrentStepId, out var step))
                {
                    if (step.Actions.TryGetValue(actionTask.ActionId, out var action))
                    {
                        processItem.ApplyMutation(new ActionProcessItemMutation()
                        {
                            ActionId        = actionTask.ActionId,
                            TargetStepId    = action.ArrivalStep,
                            PropertyChanges = actionTask.PropertyChanges
                        });
                        _processItemEventStore.StoreUnsavedMutations((IProcessItemEventContainer)processItem,
                                                                     (processItemMutationId, mutationDateTimeUtc) =>
                        {
                            processItem.SetProcessItemState(processItemMutationId, mutationDateTimeUtc);
                        });
                    }
                    else
                    {
                        throw new ActionNotFoundException(actionTask.ProcessItemId, actionTask.ProcessId, actionTask.PrincipalId, processItem.CurrentStepId, actionTask.ActionId);
                    }
                }
                else
                {
                    throw new Exception("Step not found.");
                }
            }
            _eventQueue.PublishEvent(new EventNotification()
            {
                ProcessId        = actionTask.ProcessId,
                ProcessItemId    = actionTask.ProcessItemId,
                ActionId         = actionTask.ActionId,
                NotificationKind = EventNotificationKinds.Action
            });
        }
Example #20
0
 public void Execute(IEngineTask task)
 {
     core.Pipeline.Produce(task);
 }
Example #21
0
 /// <summary>
 /// Construct a pool item.
 /// </summary>
 /// <param name="owner">The owner of this task.</param>
 /// <param name="task">The task to execute.</param>
 /// <param name="group">The group that this task belongs to.</param>
 public PoolItem(EngineConcurrency owner, IEngineTask task, TaskGroup group)
 {
     this.owner = owner;
     this.task  = task;
     this.group = group;
 }
Example #22
0
 /// <summary>
 /// Construct a pool item.
 /// </summary>
 /// <param name="owner">The owner of this task.</param>
 /// <param name="task">The task to execute.</param>
 /// <param name="group">The group that this task belongs to.</param>
 public PoolItem(EngineConcurrency owner, IEngineTask task, TaskGroup group)
 {
     _owner = owner;
     _task = task;
     _group = group;
 }
Example #23
0
 public void Execute(IEngineTask task)
 {
     core.Pipeline.Produce(task);
 }
Example #24
0
 public PoolItem(EngineConcurrency owner, IEngineTask task, TaskGroup group)
 {
     this._x071bde1041617fce = owner;
     this._x801bd3a7d5412d70 = task;
     this._xe2c9497bf778cd2b = group;
 }
 /// <summary>
 /// Construct a pool item.
 /// </summary>
 /// <param name="owner">The owner of this task.</param>
 /// <param name="task">The task to execute.</param>
 /// <param name="group">The group that this task belongs to.</param>
 public PoolItem(EngineConcurrency owner, IEngineTask task, TaskGroup group)
 {
     _owner = owner;
     _task  = task;
     _group = group;
 }