Пример #1
0
        public void CancelRun()
        {
            var run = new WorkflowRun()
            {
                WorkflowRunStatus_Enum = WorkflowRunState_Enumeration.WorkflowRunStarted, TaskId = Guid.NewGuid().ToString()
            };

            run.Save();

            Factory.WorkflowRunTaskManager.RegisterStart(run.TaskId);

            WorkflowRunHelper.CancelRun(run.Id);

            var run2 = Entity.Get <WorkflowRun>(run.Id);

            Assert.That(run2.WorkflowRunStatus_Enum, Is.EqualTo(WorkflowRunState_Enumeration.WorkflowRunCancelled));

            Assert.That(DateTime.UtcNow - run2.RunCompletedAt, Is.LessThan(TimeSpan.FromMinutes(1)));

            Assert.That(Factory.WorkflowRunTaskManager.HasCompleted(run.TaskId), Is.True);
        }
Пример #2
0
        public HttpResponseMessage CancelRun(string id)
        {
            using (Profiler.Measure(string.Format("WorkflowController.HasRunStopped [{0}]", id)))
            {
                long runId;
                if (!long.TryParse(id, out runId))
                {
                    return(new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
                }

                try
                {
                    WorkflowRunHelper.CancelRun(runId);
                    return(new HttpResponseMessage(System.Net.HttpStatusCode.OK));
                }
                catch (WorkflowRunHelper.MissingRunException)
                {
                    return(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound));
                }
            }
        }
Пример #3
0
        public void OnAfterSave(IEnumerable <IEntity> entities, IDictionary <string, object> state)
        {
            var tasks = (List <BaseUserTask>)state[CompletedTasksKey];

            var actions = new List <Action>();
            var invoker = WorkflowInvoker.DefaultInvokerForThread;

            foreach (var task in tasks)
            {
                //TODO: Serialize the workflow runs like the trigger on save.
                if (task.WorkflowRunForTask != null &&
                    task.WorkflowRunForTask.WorkflowRunStatus_Enum == WorkflowRunState_Enumeration.WorkflowRunPaused)
                {
                    var resumeEvent = new UserCompletesTaskEvent()
                    {
                        CompletionState = task.UserResponse, UserTaskRef = task.Id
                    };
                    var run = task.WorkflowRunForTask;
                    actions.Add(() => WorkflowRunHelper.ResumeWorkflow(run, resumeEvent, invoker));
                }
            }

            RunActionsInThread(actions);
        }
        public void OnAfterUpgrade(IEnumerable <IEntity> entities, IDictionary <string, object> state)
        {
            var clones       = (Dictionary <long, Workflow>)state[stateKeyClones];
            var clonedIds    = (Dictionary <long, long>)state[stateKeyClonedIds];
            var updateHashes = (Dictionary <long, string>)state[stateKeyHashes];
            var versions     = (Dictionary <long, int>)state[stateKeyVersions];

            var toSave   = new List <Workflow>();  // We need to keep these saves separately because otherwise the running instances relationship save gets confused.
            var toDelete = new List <Workflow>();

            foreach (var kvp in updateHashes)
            {
                var original = Entity.Get <Workflow>(kvp.Key);

                Workflow clone = null;
                clones.TryGetValue(kvp.Key, out clone);

                if (original.WorkflowUpdateHash != updateHashes[kvp.Key]) // we have an update
                {
                    var originalWritable = original.AsWritable <Workflow>();
                    originalWritable.WorkflowVersion = versions[kvp.Key] + 1;
                    toSave.Add(originalWritable);

                    if (clone != null)
                    {
                        WorkflowRunHelper.MoveRuns(original, clone, clonedIds);

                        //originalWritable.RunningInstances.Clear();
                        originalWritable.WfOlderVersion = clone;

                        var running = original.RunningInstances.ToList();

                        var editableClone = clone.AsWritable <Workflow>();
                        editableClone.RunningInstances.AddRange(running);

                        toSave.Add(editableClone);
                    }
                }
                else // nothing has changed, clean up
                {
                    if (clone != null)
                    {
                        toDelete.Add(clone);
                    }
                }
            }

            // We need to save the originals and clones separately otherwise cascade deletes seem to blow away all the running instances.
            if (toSave.Count > 0)
            {
                Entity.Save(toSave);
            }

            if (toDelete.Count > 0)
            {
                Entity.Delete(toDelete.Select(e => e.Id));
            }

            state.Remove(stateKeyClones);
            state.Remove(stateKeyHashes);
        }