/// <summary>节点实例监听器</summary> public void onEdgeInstanceEventFired(EdgeInstanceEvent e) { if (e.EventType == EdgeInstanceEventEnum.ON_TAKING_THE_TOKEN) { IToken token = e.Token; // 计算token的alive值 ILoopInstance transInst = (ILoopInstance)e.getSource(); String condition = transInst.Loop.Condition; calculateTheAliveValue(token, condition); if (this.RuntimeContext.IsEnableTrace && token.IsAlive) { ProcessInstanceTrace trace = new ProcessInstanceTrace(); trace.ProcessInstanceId = e.Token.ProcessInstanceId; trace.StepNumber = e.Token.StepNumber + 1; trace.Type = ProcessInstanceTraceEnum.LOOP_TYPE; trace.FromNodeId = transInst.Loop.FromNode.Id; trace.ToNodeId = transInst.Loop.ToNode.Id; trace.EdgeId = transInst.Loop.Id; //TODO wmj2003 一旦token从当前边上经过,那么就保存流程运行轨迹,这里应该是insert RuntimeContext.PersistenceService.SaveOrUpdateProcessInstanceTrace(trace); } } }
public override void fire(IToken tk) { IJoinPoint joinPoint = synchronized(tk); if (joinPoint == null) { return; } IProcessInstance processInstance = tk.ProcessInstance; NodeInstanceEvent event2 = new NodeInstanceEvent(this); event2.Token = tk; event2.EventType = NodeInstanceEventEnum.NODEINSTANCE_FIRED; this.fireNodeEvent(event2); //在此事件监听器中,删除原有的token NodeInstanceEvent event4 = new NodeInstanceEvent(this); event4.Token = tk; event4.EventType = NodeInstanceEventEnum.NODEINSTANCE_LEAVING; this.fireNodeEvent(event4); //首先必须检查是否有满足条件的循环 Boolean doLoop = false;//表示是否有满足条件的循环,false表示没有,true表示有。 if (joinPoint.Alive) { IToken tokenForLoop = null; tokenForLoop = new Token(); // 产生新的token tokenForLoop.IsAlive = joinPoint.Alive; tokenForLoop.ProcessInstance = processInstance; tokenForLoop.StepNumber = joinPoint.StepNumber - 1; tokenForLoop.FromActivityId = joinPoint.FromActivityId; for (int i = 0; i < this.LeavingLoopInstances.Count; i++) { ILoopInstance loopInstance = this.LeavingLoopInstances[i]; doLoop = loopInstance.take(tokenForLoop); if (doLoop) { break; } } } if (!doLoop) { NodeInstanceEvent event3 = new NodeInstanceEvent(this); event3.Token = tk; event3.EventType = NodeInstanceEventEnum.NODEINSTANCE_COMPLETED; this.fireNodeEvent(event3); } // NodeInstanceEvent event4 = new NodeInstanceEvent(this); // event4.setToken(tk); // event4.setEventType(NodeInstanceEvent.NODEINSTANCE_LEAVING); // this.fireNodeEvent(event4); }
public override void fire(IToken tk) { //TODO 此处性能需要改善一下,20090312 IJoinPoint joinPoint = synchronized(tk); if (joinPoint == null) { return; } //如果汇聚点的容量和同步器节点的容量相同 IProcessInstance processInstance = tk.ProcessInstance; // Synchronize的fire条件应该只与joinPoint的value有关(value==volume),与alive无关 NodeInstanceEvent event2 = new NodeInstanceEvent(this); event2.Token = tk; event2.EventType = NodeInstanceEventEnum.NODEINSTANCE_FIRED; this.fireNodeEvent(event2); //在此事件监听器中,删除原有的token NodeInstanceEvent event4 = new NodeInstanceEvent(this); event4.Token = tk; event4.EventType = NodeInstanceEventEnum.NODEINSTANCE_LEAVING; this.fireNodeEvent(event4); //首先必须检查是否有满足条件的循环,loop比transition有更高的优先级, //(只能够有一个loop的条件为true,流程定义的时候需要注意) Boolean doLoop = false;//表示是否有满足条件的循环,false表示没有,true表示有。 if (joinPoint.Alive) { IToken tokenForLoop = null; tokenForLoop = new Token(); // 产生新的token tokenForLoop.IsAlive = joinPoint.Alive; tokenForLoop.ProcessInstance = processInstance; tokenForLoop.StepNumber = joinPoint.StepNumber - 1; tokenForLoop.FromActivityId = joinPoint.FromActivityId; for (int i = 0; i < this.LeavingLoopInstances.Count; i++) { ILoopInstance loopInstance = this.LeavingLoopInstances[i]; doLoop = loopInstance.take(tokenForLoop); if (doLoop) { break; } } } if (!doLoop) {//如果没有循环,则执行transitionInstance //非顺序流转的需要生成新的token, Boolean activiateDefaultCondition = true; ITransitionInstance defaultTransInst = null; for (int i = 0; LeavingTransitionInstances != null && i < LeavingTransitionInstances.Count; i++) { ITransitionInstance transInst = LeavingTransitionInstances[i]; String condition = transInst.Transition.Condition; if (condition != null && condition.Equals(ConditionConstant.DEFAULT)) { defaultTransInst = transInst; continue; } Token token = new Token(); // 产生新的token token.IsAlive = joinPoint.Alive; token.ProcessInstance = processInstance; token.StepNumber = joinPoint.StepNumber; token.FromActivityId = joinPoint.FromActivityId; Boolean alive = transInst.take(token); if (alive) { activiateDefaultCondition = false; } } if (defaultTransInst != null) { Token token = new Token(); token.IsAlive = activiateDefaultCondition && joinPoint.Alive; token.ProcessInstance = processInstance; token.StepNumber = joinPoint.StepNumber; token.FromActivityId = joinPoint.FromActivityId; defaultTransInst.take(token); } } NodeInstanceEvent event3 = new NodeInstanceEvent(this); event3.Token = tk; event3.EventType = NodeInstanceEventEnum.NODEINSTANCE_COMPLETED; this.fireNodeEvent(event3); }
public virtual void AddEnteringLoopInstance(ILoopInstance loopInstance) { this.EnteringLoopInstances.Add(loopInstance); }
public virtual void AddLeavingLoopInstance(ILoopInstance loopInstance) { LeavingLoopInstances.Add(loopInstance); }