zoukankan      html  css  js  c++  java
  • 开源工作流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);
        }
    
  • 相关阅读:
    C#读取EXCEL中数字无法读取的方法
    学习Wml
    sqlserver.exe进程占cpu100%
    windows phone mango 页面跳转事件顺序
    Windows 8 系列(一):win 8 简介
    windows phone 小应用与随机算法的感悟
    文件下载
    html 表格固定宽度
    excel 导入科学计数法
    word 排版
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2072846.html
Copyright © 2011-2022 走看看