void IWaitingResumptionHandle.Resume(WaitingResumption waitingResumption) { var r = waitingResumption as ProcessStartResumption; var instance = WorkflowBuilder.CreateInstance(r.Process, this._parser); instance.Run(); }
public void FaultBookmark_Parallel_Children() { _process = this.CreateProcess(ParallelWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new ParallelWorkflowParser()); instance.Run(); Thread.Sleep(1000); //人工节点出错,子流程节点正常 this.AssertWorkflowInstance(instance, 2, 1); //子流程结束后完成子流程节点 instance.ResumeBookmark(instance.GetBookmarks()[1].Name, null); Thread.Sleep(1000); //子流程也发生了错误 this.AssertWorkflowInstance(instance, 2, 2); //修复子流程 ParallelWorkflowParser.SubProcess.FinishRule["error"] = "true"; instance.ResumeBookmark(instance.GetBookmarks()[1].Name, null); Thread.Sleep(1000); this.AssertWorkflowInstance(instance, 1, 2); //修复人工节点 (ParallelWorkflowParser.Human.Helper as GetUsers).Scripts[0] = "originator"; instance.ResumeBookmark(instance.GetBookmarks()[0].Name, null); Thread.Sleep(1000); //仅存在一个人工活动书签 this.AssertWorkflowInstance(instance, 1, 2); }
public void FaultBookmark_Human() { _process = this.CreateProcess(SequenceWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new SequenceWorkflowParser()); instance.Run(); Thread.Sleep(1000); //节点1执行人规则解析错误 this.AssertWorkflowInstance(instance, 1, 1); var bookmark = instance.GetBookmarks()[0].Name; //错误书签 Assert.IsTrue(bookmark.Contains("Error#")); //直接重试后仍错误 instance.ResumeBookmark(bookmark, null); Thread.Sleep(1000); this.AssertWorkflowInstance(instance, 1, 2); //同一个位置再次错误书签相同 Assert.AreEqual(bookmark, instance.GetBookmarks()[0].Name); //修复后重试 (SequenceWorkflowParser.First.Helper as GetUsers).Scripts[0] = "originator"; instance.ResumeBookmark(bookmark, null); Thread.Sleep(1000); //重试成功,生成人工任务和正常书签 this.AssertWorkflowInstance(instance, 1, 2); Assert.AreNotEqual(bookmark, instance.GetBookmarks()[0].Name); Assert.IsFalse(instance.GetBookmarks()[0].Name.Contains("Error#")); }
public void Human() { _process = this.CreateProcess(SequenceWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new SequenceWorkflowParser(false)); instance.Run(); Thread.Sleep(1000); Assert.AreEqual(1, _humanCount); this.AssertWorkflowInstance(instance, 1, 0); }
public void Server() { _process = this.CreateProcess(SequenceWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new SequenceWorkflowParser(false)); //先跳转到自动节点 this.UpdateCurrentNode(instance, 4); instance.Run(); Thread.Sleep(1000); Assert.AreEqual(1, _serverCount); }
public void FaultParallel() { _process = this.CreateProcess(ParallelWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new ParallelWorkflowParser(true)); instance.Run(); Thread.Sleep(1000); //完成子流程触发并行子活动完成回调 instance.ResumeBookmark(instance.GetBookmarks()[1].Name, null); Thread.Sleep(1000); //工作流中止异常 Assert.IsNotNull(instance.AbortedException); Assert.AreEqual(ProcessStatus.Error, _process.Status); }
void IWaitingResumptionHandle.Resume(WaitingResumption waitingResumption) { var r = waitingResumption as BookmarkResumption; var persisted = this._processService.GetWorkflowInstance(r.Process).WorkflowInstance; var instance = WorkflowBuilder.CreateInstance(r.Process, this._parser); instance.Load(persisted); //只能尝试恢复存在的书签 if (instance.GetBookmarks().Any(o => o.Name == r.BookmarkName)) { instance.Update(r.Process.GetInputs()); instance.ResumeBookmark(r.BookmarkName, r.Value); } else { this._log.WarnFormat("没有在流程“{0}”#{1}中找到名为{2}的书签,取消本次恢复", r.Process.Title, r.Process.ID, r.BookmarkName); } }
void IWaitingResumptionHandle.Resume(WaitingResumption waitingResumption) { var r = waitingResumption as SubProcessCompleteResumption; var subProcess = r.SubProcess; var parentProcess = r.Process; //尝试从父流程中获取启动该子流程的节点实例信息 SubProcessActivityInstance sub = this._processService.GetSubProcessActivityInstances(parentProcess, subProcess); if (sub == null) { throw new InvalidOperationException(string.Format("没有在父流程“{0}”#{1}中找到启动子流程“{2}”#{3}的子流程节点实例" , parentProcess.Title , parentProcess.ID , subProcess.Title , subProcess.ID)); } //将子流程的流程变量传递给父流程 var dict = subProcess.GetDataFields(); foreach (string key in dict.Keys) { parentProcess.UpdateDataField(key, dict[key]); } //唤醒父流程 var persisted = this._processService.GetWorkflowInstance(parentProcess).WorkflowInstance; var instance = WorkflowBuilder.CreateInstance(parentProcess, this._parser); instance.Load(persisted); instance.Update(parentProcess.GetInputs()); instance.ResumeBookmark(sub.ReferredBookmarkName, null); //目前不允许在调度项中生成新的非延迟调度项,无法保证预期顺序,需要有类似核心的quack机制 ////创建父流程唤醒调度项 //this._resumption.Add(new BookmarkResumption(parentProcess // , sub.ActivityName // , sub.ReferredBookmarkName // , string.Empty)); //将子流程节点置为完成 sub.SetAsComplete(); this._processService.UpdateActivityInstance(sub); }
void IWaitingResumptionHandle.Resume(WaitingResumption waitingResumption) { try { var r = waitingResumption as ErrorResumption; //错误恢复使用粗粒度实现,不延续原有工作流实例树 var instance = WorkflowBuilder.CreateInstance(r.Process, this._parser); instance.Update(r.Process.GetInputs()); instance.Run(); this._log.InfoFormat("尝试对流程{0}#{1}在FlowNodeIndex={2}处进行了错误恢复" , r.Process.Title , r.Process.ID , r.ErrorNodeIndex); } catch (Exception e) { //由于ErrorResumption本身就是错误恢复调度,即使异常也不应抛出而导致其本身被记录成error this._log.Error("错误重试时异常", e); } }
public void FaultBookmark_SubProcess() { _process = this.CreateProcess(SequenceWorkflowParser.GetActivitySettings()); TestHelper.SetProcessId(_process, Guid.NewGuid()); var instance = WorkflowBuilder.CreateInstance(_process, new SequenceWorkflowParser()); //跳转到子流程-节点2 this.UpdateCurrentNode(instance, 2); instance.Run(); Thread.Sleep(1000); this.AssertWorkflowInstance(instance, 1, 0); //此时有一个子流程节点实例 Assert.AreEqual(1, _subProcessCount); var bookmark = instance.GetBookmarks()[0].Name; //子流程结束后恢复子流程活动 instance.ResumeBookmark(bookmark, null); Thread.Sleep(1000); //发生了错误 this.AssertWorkflowInstance(instance, 1, 1); //书签复用 Assert.AreEqual(bookmark, instance.GetBookmarks()[0].Name); //错误重试,应从callback处恢复 instance.ResumeBookmark(bookmark, null); Thread.Sleep(1000); //始终只能有一个书签 this.AssertWorkflowInstance(instance, 1, 2); //重试不能重新创建子流程节点实例 Assert.AreEqual(1, _subProcessCount); //修复后重试 SequenceWorkflowParser.Second.FinishRule["error"] = "true"; instance.ResumeBookmark(bookmark, null); Thread.Sleep(1000); this.AssertWorkflowInstance(instance, 0, 2); }