Netinstance.java
/* 运行流程 * @see org.fireflow.kernel.INetInstance#run(org.fireflow.engine.IProcessInstance) */ public void run(IProcessInstance processInstance) throws KernelException { if (startNodeInstance == null) { KernelException exception = new KernelException(processInstance, this.getWorkflowProcess(), "Error:NetInstance is illegal ,the startNodeInstance can NOT be NULL "); throw exception; } //实例化一个token Token token = new Token(); //设置token的状态活动的 token.setAlive(true); //设置流程实例 token.setProcessInstance(processInstance); //设置token容量 token.setValue(startNodeInstance.getVolume()); //设置步骤号,开始节点的第一步默认为0 token.setStepNumber(0); //设置从哪个节点来 "FROM_START_NODE" 规定的节点。 token.setFromActivityId(IToken.FROM_START_NODE); //启动开始节点 startNodeInstance.fire(token); }
StartNodeInstance.java
/* * 开始节点触发 * @see org.fireflow.kernel.INodeInstance#fire(org.fireflow.kernel.IToken) */ public void fire(IToken tk) throws KernelException { //如果token不是活动,那么直接返回,注意这个应该是不必要的,因为永远不可能是不是活动的 if (!tk.isAlive()) { return;// } //检查当前token容易是不是与开始节点一致.这个是否有必要???? if (tk.getValue() != volume) { KernelException exception = new KernelException(tk.getProcessInstance(), this.startNode, "Error:Illegal StartNodeInstance,the tokenValue MUST be equal to the volume "); throw exception; } //在token中设置当前的节点ID tk.setNodeId(this.getSynchronizer().getId()); ////从token中获得流程实例对象 IProcessInstance processInstance = tk.getProcessInstance(); //触发enter事件 NodeInstanceEvent event1 = new NodeInstanceEvent(this); event1.setToken(tk); event1.setEventType(NodeInstanceEvent.NODEINSTANCE_TOKEN_ENTERED); //token进入 fireNodeEvent(event1); //触发fired事件 NodeInstanceEvent event2 = new NodeInstanceEvent(this); event2.setToken(tk); event2.setEventType(NodeInstanceEvent.NODEINSTANCE_FIRED);//token 触发 fireNodeEvent(event2); //触发leaving事件 NodeInstanceEvent event4 = new NodeInstanceEvent(this); event4.setToken(tk); event4.setEventType(NodeInstanceEvent.NODEINSTANCE_LEAVING); //token 离开 fireNodeEvent(event4); //激活默认弧线的标志 boolean activateDefaultCondition = true; ITransitionInstance defaultTransInst = null; //找到所有开始节点的输出弧 for (int i = 0; leavingTransitionInstances != null && i < leavingTransitionInstances.size(); i++) { //开始节点的边的类型只能是transition ITransitionInstance transInst = leavingTransitionInstances.get(i); String condition = transInst.getTransition().getCondition(); //如果弧线的条件!=null 并且 =“default” ,那么弧线实例就是default的弧线了。 if (condition != null && condition.equals(ConditionConstant.DEFAULT)) { ////记录default转移线,其他条件都未false,才执行它 defaultTransInst = transInst; continue; } //产生新的token Token token = new Token(); //设置状态为alive token.setAlive(true); //设置流程实例 token.setProcessInstance(processInstance); //设置token的from节点ID token.setFromActivityId(tk.getFromActivityId()); //步骤号+1 token.setStepNumber(tk.getStepNumber()+1); //触发弧线的token,开源工作流Fireflow源码分析之运行流程二中有更详细的说明 boolean alive = transInst.take(token); //如果有一个有触发,就不走default if (alive) { activateDefaultCondition = false; } } //如果defaultTransInst!=null ,走的是default值的弧线 if (defaultTransInst != null) { //产生新的token Token token = new Token(); //设置alive状态 token.setAlive(activateDefaultCondition); //设置流程实例 token.setProcessInstance(processInstance); //设置token的from节点ID token.setFromActivityId(token.getFromActivityId()); //步骤号+1 token.setStepNumber(tk.getStepNumber()+1); //触发弧线的token defaultTransInst.take(token); } //触发completed事件 NodeInstanceEvent event3 = new NodeInstanceEvent(this); event3.setToken(tk); event3.setEventType(NodeInstanceEvent.NODEINSTANCE_COMPLETED); fireNodeEvent(event3); }