Exemple #1
0
 public TaskMessage(IReadWritableTaskState taskState, ITransaction transaction, SafeDisposableActions onCompleteActions, ILogger logger)
 {
     TaskStateWritable = taskState;
     Transaction       = transaction;
     OnCompleteActions = onCompleteActions;
     Logger            = logger;
 }
Exemple #2
0
 public TaskContext(bool isStateful, SafeDisposableActions onCompleteActions, IReadWritableTaskState state, IStateManager stateManager)
 {
     _isStateful       = isStateful;
     OnCompleteActions = onCompleteActions;
     TaskStateWritable = state;
     _stateManager     = stateManager;
 }
Exemple #3
0
        public static bool ReleaseTaskWithDeferFlag(this TaskContext context, IStateManager steManager)
        {
            context.Logger.Trace($"Defer task from {context.State.DeferredCount}");

            //IStateManager steManager = Bus.StateManager;

            IReadWritableTaskState task = context.TaskStateWritable;
            var nextDeferVal            = task.DeferredCount + 1;

            if (nextDeferVal > 3)
            {
                var pendingTasks =
                    steManager.CountPendingTasksForProcess(context.ProcessExecutionContext.ProcessState.Id);
                var deferLimitExceeded = pendingTasks <= nextDeferVal; //(pendingTasks - 1) <= nextDeferVal;
                if (deferLimitExceeded)                                //skip itself
                {
                    context.Logger.Warn(
                        $"Can't further defer task because only {pendingTasks} tasks remaining and current task is deferred {task.DeferredCount} times. Check circular dependency");
                    return(false);
                }
            }

            task.DeferredCount = nextDeferVal;

            task.UpdatedOn = DateTime.UtcNow;
            //task.Status = ResultStatus.Empty;
            task.IsFinished = false;
            task.IsStopped  = false;
            task.NodeKey    = null;

            steManager.UpdateTask(task, context.Transaction, true);
            context.Logger.Info($"Task deferred {nextDeferVal} time");
            //context.Transaction.Commit();
            return(true);
        }
Exemple #4
0
        public static void MarkTaskStarted(this TaskContext context, IStateManager steManager)
        {
            //IStateManager steManager = Bus.StateManager;

            IReadWritableTaskState task = context.TaskStateWritable;

            task.StartedOn = DateTime.UtcNow;
            task.UpdatedOn = DateTime.UtcNow;

            steManager.UpdateTask(task, context.Transaction);
        }
Exemple #5
0
        internal static void PreserveNextState(this TaskContext context, string state, IStateManager steManager, string taskState = null)
        {
            //IStateManager steManager = Bus.StateManager;

            List <KeyValuePair <string, string> > statList = new List <KeyValuePair <string, string> >();

            statList.Add(new KeyValuePair <string, string>(KeyConstants.TaskNextState, state));
            statList.Add(new KeyValuePair <string, string>(KeyConstants.TaskPreviousState, context.NextState));
            steManager.SaveTaskStates(context.State.Id, context.State.ProcessId, statList);

            IReadWritableTaskState task = context.TaskStateWritable;
            var next = context.State.CurrentState ?? context.NextState;

            context.NextState = state; //string.Empty;
            context.PrevState = next;
            task.CurrentState = taskState ?? state;
            steManager.UpdateTask(task, context.Transaction);
        }
Exemple #6
0
        public static bool MarkTaskStatus(this TaskContext context, CompletionStatus completionStatus, ResultStatus result, string reason, IStateManager steManager)
        {
            try
            {
                context.Logger.Info(reason);
                //IStateManager steManager = Bus.StateManager;

                //todo:
                IReadWritableTaskState task = context.TaskStateWritable;
                var isDone = completionStatus.IsDone();
                if (isDone)
                {
                    task.IsFinished  = true;
                    task.CompletedOn = DateTime.UtcNow;
                }

                if (result.Id == ResultStatus.Error.Id)
                {
                    task.FailedCount = task.FailedCount + 1;
                }
                task.UpdatedOn = DateTime.UtcNow;
                task.Status    = result;

                steManager.UpdateTask(task, context.Transaction, isDone);
                if (isDone)
                {
                    context.Logger.Info("Done");
                    //context.Transaction.Commit();
                }

                return(true);
            }
            catch (FrameworkException e)
            {
                context.Logger.Error("FrameworkException while updating task status from node {node}, Complete: {complete}, Result: {result}, Reason: {reason} with error {error}", NodeSettings.Instance.Name, completionStatus.Name, result.Name, reason, e);

                return(false);
            }
            catch (Exception e)
            {
                context.Logger.Error("Failed to update task status from node {node}, Complete: {complete}, Result: {result}, Reason: {reason} with error {error}", NodeSettings.Instance.Name, completionStatus.Name, result.Name, reason, e);
                return(false);
            }
        }
Exemple #7
0
        public void Handle <T>(IEnumerable <T> volume, IProcessExecutionContextWithVolume processContext, CancellationToken token)
        {
            if (volume == null)
            {
                processContext.Logger.Info("No volume returned");
                return;
            }

            bool hasVolume    = false;
            var  serializer   = _serializersFactory.GetSerializer <T>();
            int  currentCount = 0;
            int  batchSize    = 100;


            try
            {
                Bus.HandleDbCommand(new DbAction(DbActions.Transaction, () => //create transaction in Db Bus pipeline
                {
                    var volumeDeletedCount = ExecuteNonQuery(Constant.SQLDeleteProcessVolume, processContext.ProcessState.Id);
                    if (volumeDeletedCount > 0)
                    {
                        processContext.Logger.Warn($"Existing volume {volumeDeletedCount} deleting");
                    }
                }));

                //using (var unitOfWork = ) //IsolationLevel.Snapshot //todo check isolation level with db team, is it enabled by default
                {
                    foreach (var v in volume)
                    {
                        var payLoad = serializer.SerializeToString(v);
                        IReadWritableTaskState state = CreateNew();

                        state.Payload      = payLoad;
                        state.ProcessId    = processContext.ProcessState.Id;
                        state.CurrentState = ResultStatus.Empty.Name;

                        currentCount++;
                        if (currentCount >= batchSize)
                        {
                            token.ThrowIfCancellationRequested();

                            hasVolume = true;
                            //Persist();
                            currentCount = 0;
                            //Clear();//remove persisted items
                        }
                    }
                    //if (Entity.Count>0)
                    {
                        token.ThrowIfCancellationRequested();
                        hasVolume = true;
                        // Persist();
                    }

                    //Commit();
                }
            }
            finally
            {
                //dispose / rollback
            }

            if (hasVolume)
            {
                processContext.SetVolumeGenerated();
            }
        }