示例#1
0
        void IWaitingResumptionHandle.Resume(WaitingResumption waitingResumption)
        {
            var r        = waitingResumption as ProcessStartResumption;
            var instance = WorkflowBuilder.CreateInstance(r.Process, this._parser);

            instance.Run();
        }
示例#2
0
        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);
        }
示例#3
0
        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#"));
        }
示例#4
0
        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);
        }
示例#5
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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
            }
        }
示例#8
0
        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);
        }
示例#9
0
        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);
            }
        }
示例#10
0
        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);
        }