开源工作流Fireflow源码分析之运行流程一

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);
    }
原文地址:https://www.cnblogs.com/mzhanker/p/2072846.html