zoukankan      html  css  js  c++  java
  • 开源工作流Fireflow源码分析之启动流程实例一

    //这里使用了回调函数,这里手工处理事务的一种方法
            currentProcessInstance = (IProcessInstance) transactionTemplate.execute(new TransactionCallback() {
                public Object doInTransaction(TransactionStatus arg0) {
                    try {
                    	//IWorkflowSession是流程操作的入口,需要从runtimeContext获得。
                        IWorkflowSession workflowSession = runtimeContext.getWorkflowSession();
                        
                        //创建流程实例
                        //"LeaveApplicationProcess"是流程定义id
                        // CurrentUserAssignmentHandler.APPLICANT:表示流程创建者,下面会有更详细的说明
                        IProcessInstance processInstance = workflowSession.createProcessInstance(
                        		    "LeaveApplicationProcess",CurrentUserAssignmentHandler.APPLICANT);
                        //运行流程实例
                  processInstance.run();
    
                        return processInstance;
                    } catch (EngineException ex) {
                        Logger.getLogger(LeaveApplicationTester.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (KernelException ex) {
                        Logger.getLogger(LeaveApplicationTester.class.getName()).log(Level.SEVERE, null, ex);
                    }
    
                    return null;
                }
            });		
    

    WorkflowSession.java

    	public IProcessInstance createProcessInstance(String workflowProcessName,
    			ITaskInstance parentTaskInstance) throws EngineException,
    			KernelException {
    		return _createProcessInstance(workflowProcessName, parentTaskInstance
    				.getId(), parentTaskInstance.getProcessInstanceId(),
    				parentTaskInstance.getId());
    	}
    /**
    	 * 创建一个新的流程实例 (create a new process instance )
    	 * @param workflowProcessId  流程定义ID
    	 * @param creatorId  创建人ID
    	 * @param parentProcessInstanceId  父流程实例ID
    	 * @param parentTaskInstanceId     父任务实例ID
    	 * @return
    	 * @throws EngineException
    	 * @throws KernelException
    	 */
    	protected IProcessInstance _createProcessInstance(String workflowProcessId,
    			final String creatorId, final String parentProcessInstanceId,
    			final String parentTaskInstanceId) throws EngineException,
    			KernelException {
    		//设置流程ID
    		final String wfprocessId = workflowProcessId;
    		//得到流程定义文件
    		final WorkflowDefinition workflowDef = runtimeContext.getDefinitionService().getTheLatestVersionOfWorkflowDefinition(wfprocessId);
    		//得到工作流模型
    		final WorkflowProcess wfProcess = workflowDef.getWorkflowProcess();
            //如果工作流模型为null,则抛出异常
    		if (wfProcess == null) {
    			throw new RuntimeException(
    					"Workflow process NOT found,id=[" + wfprocessId
    							+ "]");
    		}
    		//生成流程实列
    		IProcessInstance processInstance =  (IProcessInstance) this.execute(new IWorkflowSessionCallback() {
    
    			public Object doInWorkflowSession(RuntimeContext ctx)
    					throws EngineException, KernelException {
                    //新建一个流程实例
    				ProcessInstance processInstance = new ProcessInstance();
    				//设置创建者
    				processInstance.setCreatorId(creatorId);
    				//设置工作流模型ID
    				processInstance.setProcessId(wfProcess.getId());
    				//设置流程定义版本
    				processInstance.setVersion(workflowDef.getVersion());
    				//设置工作流模型显示的名称
    				processInstance.setDisplayName(wfProcess.getDisplayName());
    				//设置工作流名称
    				processInstance.setName(wfProcess.getName());
    				//设置流程的状态为初始状态
    				processInstance.setState(IProcessInstance.INITIALIZED);
    				//设置流程实例的创建时间
    				processInstance.setCreatedTime(ctx.getCalendarService()
    						.getSysDate());
    				//如果是当前是子流程,则设置父流程实例id,否则设置值为null
    				processInstance
    						.setParentProcessInstanceId(parentProcessInstanceId);
    				//如果当前是子流程,则设置创建子流程的任务ID
    				processInstance.setParentTaskInstanceId(parentTaskInstanceId);
    				//将流程实例保存到数据库
    				ctx.getPersistenceService().saveOrUpdateProcessInstance(
    						processInstance);
    				
    				return processInstance;
    			}
    		});
    		
    		// 初始化流程变量
    		processInstance.setProcessInstanceVariables(new HashMap<String, Object>());
    		
    		List<DataField> datafields = wfProcess.getDataFields();
    		for (int i = 0; datafields != null && i < datafields.size(); i++) {
    			DataField df =  datafields.get(i);
    			if (df.getDataType().equals(DataField.STRING)) {
    				if (df.getInitialValue() != null) {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), df.getInitialValue());
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), "");
    				}
    			} else if (df.getDataType().equals(DataField.INTEGER)) {
    				if (df.getInitialValue() != null) {
    					try {
    						Integer intValue = new Integer(df
    								.getInitialValue());
    						processInstance.setProcessInstanceVariable(df
    								.getName(), intValue);
    					} catch (Exception e) {
    					}
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), new Integer(0));
    				}
    			} else if (df.getDataType().equals(DataField.LONG)) {
    				if (df.getInitialValue() != null) {
    					try {
    						Long longValue = new Long(df.getInitialValue());
    						processInstance.setProcessInstanceVariable(df
    								.getName(), longValue);
    					} catch (Exception e) {
    					}
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), new Long(0));
    				}
    			} else if (df.getDataType().equals(DataField.FLOAT)) {
    				if (df.getInitialValue() != null) {
    					Float floatValue = new Float(df.getInitialValue());
    					processInstance.setProcessInstanceVariable(df
    							.getName(), floatValue);
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), new Float(0));
    				}
    			} else if (df.getDataType().equals(DataField.DOUBLE)) {
    				if (df.getInitialValue() != null) {
    					Double doubleValue = new Double(df
    							.getInitialValue());
    					processInstance.setProcessInstanceVariable(df
    							.getName(), doubleValue);
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), new Double(0));
    				}
    			} else if (df.getDataType().equals(DataField.BOOLEAN)) {
    				if (df.getInitialValue() != null) {
    					Boolean booleanValue = new Boolean(df
    							.getInitialValue());
    					processInstance.setProcessInstanceVariable(df
    							.getName(), booleanValue);
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), Boolean.FALSE);
    				}
    			} else if (df.getDataType().equals(DataField.DATETIME)) {
    				// TODO 需要完善一下
    				if (df.getInitialValue() != null
    						&& df.getDataPattern() != null) {
    					try {
    						SimpleDateFormat dFormat = new SimpleDateFormat(
    								df.getDataPattern());
    						Date dateTmp = dFormat.parse(df
    								.getInitialValue());
    						processInstance.setProcessInstanceVariable(df
    								.getName(), dateTmp);
    					} catch (Exception e) {
    						processInstance.setProcessInstanceVariable(df
    								.getName(), null);
    						e.printStackTrace();
    					}
    				} else {
    					processInstance.setProcessInstanceVariable(df
    							.getName(), null);
    				}
    			}
    		}
    		//返回任务实例 
    		return processInstance;
    	}
    

    ProcessInstance.java

     /*
         * 流程实例开始运行
         * @see org.fireflow.engine.IProcessInstance#run()
         */
        public void run() throws EngineException, KernelException {
        	//如果流程实例状态不在初始状态,则抛出异常
            if (this.getState().intValue() != IProcessInstance.INITIALIZED) {
                throw new EngineException(this.getId(),
                        this.getWorkflowProcess(),
                        this.getProcessId(), "The state of the process instance is " + this.getState() + ",can not run it ");
            }
            //取得工作流网实例,这个接下来看:开源工作流Fireflow源码分析之启动流程实例二
    INetInstance netInstance = rtCtx.getKernelManager().getNetInstance(this.getProcessId(), this.getVersion()); if (netInstance == null) { throw new EngineException(this.getId(), this.getWorkflowProcess(), this.getProcessId(), "The net instance for the workflow process [Id=" + this.getProcessId() + "] is Not found"); } //触发启动流程实例的事件 ProcessInstanceEvent event = new ProcessInstanceEvent(); event.setEventType(ProcessInstanceEvent.BEFORE_PROCESS_INSTANCE_RUN); event.setSource(this); this.fireProcessInstanceEvent(event); //设置流程实例的状态为运行状态 this.setState(IProcessInstance.RUNNING); this.setStartedTime(rtCtx.getCalendarService().getSysDate()); //保存流程实例 rtCtx.getPersistenceService().saveOrUpdateProcessInstance(this); //运行工作流网实例,从startnode开始,这个接下来看:开源工作流Fireflow源码分析之运行流程实例一 netInstance.run(this); }
  • 相关阅读:
    第一章计算机系统知识
    Java面试宝典摘抄
    Java的容器类Collection和Map
    log4j.properties 详解与配置步骤(转)
    JSTL中的TLD配置和使用。
    (原创)mybatis学习四,利用mybatis自动创建代码
    C#常用方法
    Spring 3.x jar 包详解 与 依赖关系
    spring mvc JSON实现方式
    Structs2配置文件相关说明
  • 原文地址:https://www.cnblogs.com/mzhanker/p/2072831.html
Copyright © 2011-2022 走看看