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); }
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)); } } }
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); }