public HumanEscalationResumption(Process process, DateTime? at, HumanActivityInstance humanActivityInstance) : base(process, WaitingResumption.MaxPriority, at) { this.HumanActivityInstance = humanActivityInstance; if (this.HumanActivityInstance == null) throw new InvalidOperationException("HumanActivityInstance不能为空"); }
private void Init(HumanActivityInstance humanActivityInstance) { this.HumanActivityInstance = humanActivityInstance; if (this.HumanActivityInstance == null) throw new InvalidOperationException("HumanActivityInstance不能为空"); }
public void WorkItemCreateResumption() { var process = this.Prepare(); //由于创建时会产生ProcessStart,应先取消不必要的调度请求 this._resumptionService.CancelAll(process); TestHelper.ChangeProcessStatus(process, ProcessStatus.Running); var h = new HumanActivityInstance(process.ID, 0, 1, "节点1", "1", new string[] { "houkun" }); this._processService.CreateActivityInstance(h); var r = new WorkItemCreateResumption(process, h); this._resumptionService.Add(r); //执行人工任务创建调度 this._scheduler.Resume(r); this.AssertExecutedResumption(r); this.Evict(process); var process2 = this._processService.GetProcess(process.ID); //任务数=1 Assert.AreEqual(1, this._workItemService.GetWorkItems(process2).Count()); Assert.AreEqual("节点1", this._workItemService.GetWorkItems(process2).First().ActivityName); Assert.AreEqual("houkun", this._workItemService.GetWorkItems(process2).First().Actioner.UserName); }
public void Get() { var p = this.CreateProcess(USER, TYPENAME); var type = this._processTypeService.GetProcessType(TYPENAME); var user = this._userService.GetUserWhatever(USER); var instance1 = new HumanActivityInstance(p.ID, 1, 1, "审批1", "1", new string[] { "houkun" }); var instance2 = new HumanActivityInstance(p.ID, 1, 1, "审批2", "1", new string[] { "houkun" }); this._processService.CreateActivityInstance(instance1); this._processService.CreateActivityInstance(instance2); this._workItemService.Create(new WorkItem(user, p, instance1)); this._workItemService.Create(new WorkItem(user, p, instance1)); this._workItemService.Create(new WorkItem(user, p, instance2)); Assert.AreEqual(3, this._workItemService.GetWorkItems(user).Count()); Assert.AreEqual(3, this._workItemService.GetWorkItems(user, p, null).Count()); Assert.AreEqual(2, this._workItemService.GetWorkItems(user, p, "审批1").Count()); //facade Assert.AreEqual(3, this._managementApi.GetWorkItems(USER).Length); Assert.AreEqual(3, this._managementApi.GetWorkItemsByProcess(USER, p.ID, null).Length); Assert.AreEqual(2, this._managementApi.GetWorkItemsByProcess(USER, p.ID, "审批1").Length); _log.Info(this._managementApi.GetAllWorkItemsByType(TYPENAME).Length); }
public void Get() { var p = this.CreateProcess(USER, TYPENAME); var type = this._processTypeService.GetProcessType(TYPENAME); var user = this._userService.GetUserWhatever(USER); var instance1 = new HumanActivityInstance(p.ID, 1, 1, "审批1", "1", new string[] { "houkun" }); var instance2 = new HumanActivityInstance(p.ID, 1, 1, "审批2", "1", new string[] { "houkun" }); this._processService.CreateActivityInstance(instance1); this._processService.CreateActivityInstance(instance2); this._workItemService.Create(new WorkItem(user, p, instance1)); this._workItemService.Create(new WorkItem(user, p, instance1)); this._workItemService.Create(new WorkItem(user, p, instance2)); Assert.AreEqual(3, this._workItemService.GetWorkItems(user).Count()); Assert.AreEqual(3, this._workItemService.GetWorkItems(user, p, null).Count()); Assert.AreEqual(2, this._workItemService.GetWorkItems(user, p, "审批1").Count()); //facade Assert.AreEqual(3, this._managementApi.GetWorkItems(USER).Length); Assert.AreEqual(3, this._managementApi.GetWorkItemsByProcess(USER, p.ID, null).Length); Assert.AreEqual(2, this._managementApi.GetWorkItemsByProcess(USER, p.ID, "审批1").Length); _log.Info(this._managementApi.GetAllWorkItemsByType(TYPENAME).Length); }
private Client.ActivityInstance Parse(HumanActivityInstance instance) { return(new Client.ActivityInstance() { ActivityName = instance.ActivityName, CreateTime = instance.CreateTime }); }
public HumanEscalationResumption(Process process, DateTime?at, HumanActivityInstance humanActivityInstance) : base(process, WaitingResumption.MaxPriority, at) { this.HumanActivityInstance = humanActivityInstance; if (this.HumanActivityInstance == null) { throw new InvalidOperationException("HumanActivityInstance不能为空"); } }
private void Init(HumanActivityInstance humanActivityInstance) { this.HumanActivityInstance = humanActivityInstance; if (this.HumanActivityInstance == null) { throw new InvalidOperationException("HumanActivityInstance不能为空"); } }
public void GetActivityInstanceByWorkflowActivityInstanceId() { var process = this.CreateProcess(); var instance = new HumanActivityInstance(process.ID, 0, 1, "人工节点", "bookmark", new string[] { "houkun", "xiaoxuan" }); this._processService.CreateActivityInstance(instance); var instance2 = this._processService.GetActivityInstanceByWorkflowActivityInstanceId(process, 1); Assert.IsNotNull(instance2); Assert.IsInstanceOf<HumanActivityInstance>(instance2); Assert.AreEqual(instance.ID, instance2.ID); }
public void Release() { var type = new ProcessType("ReleaseSlotTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , 2//slot=2 , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") , null , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("release slot test", type, user); this._processService.Create(p); var instance = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance); //置为open var w1 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w1, WorkItemStatus.Open); var w2 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w2, WorkItemStatus.Open); //置为没有slot var w3 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w3, WorkItemStatus.NoSlot); this._workItemService.Create(w1); this._workItemService.Create(w2); this._workItemService.Create(w3); //释放 this._workItemService.Release(w1); //释放后w3应为New状态 Assert.AreEqual(WorkItemStatus.New, this._workItemService.GetWorkItem(w3.ID).Status); //w1为New Assert.AreEqual(WorkItemStatus.New, this._workItemService.GetWorkItem(w1.ID).Status); //w2没有影响 Assert.AreEqual(WorkItemStatus.Open, this._workItemService.GetWorkItem(w2.ID).Status); }
public void Human() { var instance = new HumanActivityInstance(Guid.NewGuid(), 0, 1, "人工节点", "bookmark", new string[] { "houkun", "xiaoxuan" }); this._processService.CreateActivityInstance(instance); Assert.AreNotEqual(0, instance.ID); //TODO:对私有方法进行断言 this.Evict(instance); var instance2 = this._processService.GetActivityInstance(instance.ID); Assert.IsNotNull(instance2); Assert.IsInstanceOf<HumanActivityInstance>(instance2); }
public void Open_SlotLessThanActioner() { var type = new ProcessType("SlotTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , 2//slot=2 , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") , null , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("slot test", type, user); this._processService.Create(p); var instance = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance); var w1 = new WorkItem(user, p, instance); var w2 = new WorkItem(user, p, instance); var w3 = new WorkItem(user, p, instance); this._workItemService.Create(w1); this._workItemService.Create(w2); this._workItemService.Create(w3); Assert.AreEqual(WorkItemStatus.Open, this._workItemService.Open(w1.ID, user).Status); Assert.AreEqual(WorkItemStatus.Open, this._workItemService.Open(w2.ID, user).Status); try { this._workItemService.Open(w3.ID, user); Assert.IsTrue(false); } catch (Exception e) { _log.Info(e.Message); } Assert.IsNull(this._workItemService.GetWorkItem(w3.ID)); }
public void GetActivityInstanceByWorkflowActivityInstanceId() { var process = this.CreateProcess(); var instance = new HumanActivityInstance(process.ID, 0, 1, "人工节点", "bookmark", new string[] { "houkun", "xiaoxuan" }); this._processService.CreateActivityInstance(instance); var instance2 = this._processService.GetActivityInstanceByWorkflowActivityInstanceId(process, 1); Assert.IsNotNull(instance2); Assert.IsInstanceOf <HumanActivityInstance>(instance2); Assert.AreEqual(instance.ID, instance2.ID); }
public void Human() { var instance = new HumanActivityInstance(Guid.NewGuid(), 0, 1, "人工节点", "bookmark", new string[] { "houkun", "xiaoxuan" }); this._processService.CreateActivityInstance(instance); Assert.AreNotEqual(0, instance.ID); //TODO:对私有方法进行断言 this.Evict(instance); var instance2 = this._processService.GetActivityInstance(instance.ID); Assert.IsNotNull(instance2); Assert.IsInstanceOf <HumanActivityInstance>(instance2); }
public ActivityInstanceArgs(HumanActivityInstance instance, Process process) { this.Instance = instance; this.Process = process; }
/// <summary> /// 初始化任务待创建请求记录 /// </summary> /// <param name="process"></param> /// <param name="humanActivityInstance"></param> public WorkItemCreateResumption(Process process, HumanActivityInstance humanActivityInstance) : base(process, WaitingResumption.MaxPriority) { this.Init(humanActivityInstance); }
public void Release() { var type = new ProcessType("ReleaseSlotTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , 2//slot=2 , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") , null , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("release slot test", type, user); this._processService.Create(p); var instance = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance); //置为open var w1 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w1, WorkItemStatus.Open); var w2 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w2, WorkItemStatus.Open); //置为没有slot var w3 = new WorkItem(user, p, instance); TestHelper.ChangeWorkItemStatus(w3, WorkItemStatus.NoSlot); this._workItemService.Create(w1); this._workItemService.Create(w2); this._workItemService.Create(w3); //释放 this._workItemService.Release(w1); //释放后w3应为New状态 Assert.AreEqual(WorkItemStatus.New, this._workItemService.GetWorkItem(w3.ID).Status); //w1为New Assert.AreEqual(WorkItemStatus.New, this._workItemService.GetWorkItem(w1.ID).Status); //w2没有影响 Assert.AreEqual(WorkItemStatus.Open, this._workItemService.GetWorkItem(w2.ID).Status); }
private void Execute(int slotCount, string rule, bool open) { #region 准备数据 var type = new ProcessType("ConcurrentTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , slotCount , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") //,null , new FinishRule(new Dictionary<string, string>() { { "ok", rule } }) , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("ConcurrentTest", type, user); this._processService.Create(p); var instance1 = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); var instance2 = new HumanActivityInstance(p.ID, 0, 2, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance1); this._processService.CreateActivityInstance(instance2); #endregion #region 创建任务 var list = new List<WorkItem>(); while (list.Count < 20) { var w1 = new WorkItem(user, p, instance1); this._workItemService.Create(w1); list.Add(w1); //var w2 = new WorkItem(user, p, instance2); //this._workItemService.Create(w2); //list.Add(w2); } #endregion var count = 0; var w = new Stopwatch(); w.Start(); if (open) { #region open list.AsParallel().ForAll(o => { try { this._workItemService.Open(o.ID, user); Interlocked.Increment(ref count); } catch (Exception e) { _log.Info(e.Message); } }); #endregion } else { #region execute list.AsParallel().ForAll(o => { try { this._workItemService.Execute(o.ID, user, "同意", null); Interlocked.Increment(ref count); } catch (Exception e) { _log.Info(e.Message); } }); #endregion } w.Stop(); if (open && slotCount != 0) Assert.AreEqual(slotCount, count); else if (slotCount != 0) Assert.AreEqual(slotCount / 2, count); Trace.WriteLine(string.Format("执行[{0}]数量={1}|耗时={2}|平均={3}次/s|平均={4}ms/次" , open ? "open" : "execute" , list.Count , w.ElapsedMilliseconds , ((double)list.Count / (double)w.ElapsedMilliseconds) * 1000 , (double)w.ElapsedMilliseconds / (double)list.Count)); }
public void Open_SlotLessThanActioner() { var type = new ProcessType("SlotTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , 2//slot=2 , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") , null , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("slot test", type, user); this._processService.Create(p); var instance = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance); var w1 = new WorkItem(user, p, instance); var w2 = new WorkItem(user, p, instance); var w3 = new WorkItem(user, p, instance); this._workItemService.Create(w1); this._workItemService.Create(w2); this._workItemService.Create(w3); Assert.AreEqual(WorkItemStatus.Open, this._workItemService.Open(w1.ID, user).Status); Assert.AreEqual(WorkItemStatus.Open, this._workItemService.Open(w2.ID, user).Status); try { this._workItemService.Open(w3.ID, user); Assert.IsTrue(false); } catch (Exception e) { _log.Info(e.Message); } Assert.IsNull(this._workItemService.GetWorkItem(w3.ID)); }
private void Execute(int slotCount, string rule, bool open) { #region 准备数据 var type = new ProcessType("ConcurrentTest" , new ProcessType.WorkflowDefinition("") , new HumanSetting(0 , "节点1" , new string[] { "同意" } , slotCount , HumanSetting.SlotDistributionMode.AllAtOnce , "" , null , new HumanActionerRule("originator") //,null , new FinishRule(new Dictionary <string, string>() { { "ok", rule } }) , null , false)) { Group = "test" }; this._processTypeService.Create(type); var user = this._userService.GetUserWhatever(USER); var p = new Process("ConcurrentTest", type, user); this._processService.Create(p); var instance1 = new HumanActivityInstance(p.ID, 0, 1, "节点1", "bookmark", new string[] { user.UserName }); var instance2 = new HumanActivityInstance(p.ID, 0, 2, "节点1", "bookmark", new string[] { user.UserName }); this._processService.CreateActivityInstance(instance1); this._processService.CreateActivityInstance(instance2); #endregion #region 创建任务 var list = new List <WorkItem>(); while (list.Count < 20) { var w1 = new WorkItem(user, p, instance1); this._workItemService.Create(w1); list.Add(w1); //var w2 = new WorkItem(user, p, instance2); //this._workItemService.Create(w2); //list.Add(w2); } #endregion var count = 0; var w = new Stopwatch(); w.Start(); if (open) { #region open list.AsParallel().ForAll(o => { try { this._workItemService.Open(o.ID, user); Interlocked.Increment(ref count); } catch (Exception e) { _log.Info(e.Message); } }); #endregion } else { #region execute list.AsParallel().ForAll(o => { try { this._workItemService.Execute(o.ID, user, "同意", null); Interlocked.Increment(ref count); } catch (Exception e) { _log.Info(e.Message); } }); #endregion } w.Stop(); if (open && slotCount != 0) { Assert.AreEqual(slotCount, count); } else if (slotCount != 0) { Assert.AreEqual(slotCount / 2, count); } Trace.WriteLine(string.Format("执行[{0}]数量={1}|耗时={2}|平均={3}次/s|平均={4}ms/次" , open ? "open" : "execute" , list.Count , w.ElapsedMilliseconds , ((double)list.Count / (double)w.ElapsedMilliseconds) * 1000 , (double)w.ElapsedMilliseconds / (double)list.Count)); }
/// <summary> /// 初始化任务待创建请求记录 /// </summary> /// <param name="process"></param> /// <param name="humanActivityInstance"></param> public WorkItemCreateResumption(Process process, HumanActivityInstance humanActivityInstance) : base(process, WaitingResumption.MaxPriority) { this.Init(humanActivityInstance); }
public void Create() { var process = this.Prepare(); var subProcess = this.PrepareSubProcess(process); //流程发起调度 WaitingResumption r = new ProcessStartResumption(process); this._resumptionService.Add(r); this.Evict(r); WaitingResumption r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <ProcessStartResumption>(r2); //书签恢复调度 r = new BookmarkResumption(process, "节点1", "bookmark", "result"); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <BookmarkResumption>(r2); //错误恢复调度 r = new ErrorResumption(process, 0); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <ErrorResumption>(r2); //人工任务创建调度 var h = new HumanActivityInstance(process.ID, 0, 1, "节点", "bookmark", new string[] { "houkun" }); this._processService.CreateActivityInstance(h); r = new WorkItemCreateResumption(process, h); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <WorkItemCreateResumption>(r2); //流程完成调度 TestHelper.ChangeProcessStatus(subProcess, ProcessStatus.Completed); r = new SubProcessCompleteResumption(process, subProcess); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <SubProcessCompleteResumption>(r2); //子流程启动调度 var sub = new SubProcessActivityInstance(process.ID, 0, 1, "节点", "bookmark"); this._processService.CreateActivityInstance(sub); r = new SubProcessCreateResumption(process, sub); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <SubProcessCreateResumption>(r2); //节点实例取消调度 r = new ActivityInstanceCancelResumption(process, h); this._resumptionService.Add(r); this.Evict(r); r2 = this._resumptionService.Get(r.ID); Assert.IsNotNull(r2); Assert.IsInstanceOf <ActivityInstanceCancelResumption>(r2); }
//允许获取任何状态的任务用于计算 //不允许声明独立事务 udplock、rowlock public IEnumerable <WorkItem> FindWorkItemsByActivityInstance(Process process, HumanActivityInstance humanActivityInstance) { return(this.GetSession() .CreateCriteria <WorkItem>() .SetLockMode(LockMode.Upgrade) .SetCacheable(false) .Add(Expression.Eq("Process", process)) .Add(Expression.Eq("ActivityInstance", humanActivityInstance)).List <WorkItem>()); }
private Client.ActivityInstance Parse(HumanActivityInstance instance) { return new Client.ActivityInstance() { ActivityName = instance.ActivityName, CreateTime = instance.CreateTime }; }
public ActivityInstanceArgs(HumanActivityInstance instance, Process process) { this.Instance = instance; this.Process = process; }