• JBPM学习(四):运行流程实例


    概念:

    ProcessInstance,流程实例:代表流程定义的一次执行.:张三昨天按请假流程请了一次假.一个流程实例包含了全部执行阶段,当中最典型的属性就是跟踪当前节点的指针,例如以下图。

     

    Execution,运行:普通情况下,一个流程实例是一个运行树的根节点。 

    使用树状结构的原因在于, 这一概念仅仅有一条运行路径, 使用起来更简单。业务API不须要了解流程实例和运行之间功能的差别。因此,API里仅仅有一个运行类型来引用流程实例和运行。

    如果汇款和存档能够同一时候运行。那么主流程实例就包括了2个用来跟踪状态的子节点:

     

    总的来说:

    ProcessInstance(流程实例)就是Execution(运行对象),processInstanceId就是executionId。

     在源代码中。ProcessInstance接口直接继承了Execution接口。

    package org.jbpm.api;
    
    
    /** a process instance is one execution of a process definition.
     * One process instance can have many concurrent executions.  
     * Executions are structured in a tree of which the ProcessInstance 
     * is the root.
     * 
     * @author Tom Baeyens
     */
    public interface ProcessInstance extends Execution {
    }

    凝视大概意思为:

    一个流程实例是一个流程定义的运行。

    一个流程实例能够有多个同一时候进行的运行对象。

    运行对象构成了一棵树,而流程实例是这棵树的根结点。


    1.启动流程实例

    a) 普通方法

    // 启动流程实例
    	// jbpm4_execution,正在运行的信息表
    	// jbpm4_hist_procinst,历史信息表
    	@Test
    	public void startProcessInstance() {
    		// 使用指定key的最新版本号的流程定义启动流程实例,返回一个实例流程对象
    		ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
    
    		System.out.println("id=" + pi.getId()//
    				+ ", state=" + pi.getState()//
    				+ ", processDefinitionId=" + pi.getProcessDefinitionId());
    	}

    b) 启动流程实例,并设置一些流程变量

    Map<String, Object> variables = new HashMap<String, Object>();
    	variables.put("申请人", "张三");
    	variables.put("报销金额", 1000.00);
    	 
    	// 启动流程实例,并设置一些流程变量
    	ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processDefinitionKey, variables);


    2.向后运行一步(Signal

    a) 向后运行一步。使用唯一的outcome离开活动

    processEngine.getExecutionService().signalExecutionById(executionId);

    b) 向后运行一步,使用唯一的outcome离开活动,并设置一些流程变量

    // 准备流程变量
    	Map<String, Object> variables = new HashMap<String, Object>();
    	variables.put("审批结果", "允许");
    	processEngine.getExecutionService().signalExecutionById(executionId, variables);


    c) 向后运行一步。使用指定的outcome离开活动


    String outcome= "to end1";
    	processEngine.getExecutionService().signalExecutionById(executionId, outcome);

    d) 向后运行一步,使用指定的outcome离开活动,并设置一些流程变量

    String outcome= "to end1";
    	Map<String, Object> variables = new HashMap<String, Object>();
    	variables.put("审批结果", "允许");
    	processEngine.getExecutionService().signalExecutionById(executionId, outcome, variables);


    3.查询任务

    a) 查询个人任务列表

    // 查询我的未办理完的任务列表
    	// jbpm4_task,正在运行的信息表
    	// jbpm4_hist_task,历史信息表
    	@Test
    	public void findMyTaskList() {
    		String userId = "员工";
    		//String userId = "部门经理";
    		//String userId = "总经理";
    
    		// 方式1.查询我全部未办理的任务的列表
    		// List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);
    		// 方式2.分页的查询
    		List<Task> list = processEngine.getTaskService()//
    				.createTaskQuery()//
    				.assignee(userId)//
    				.page(0, 100)
    				.list();
    
    		// 显示
    		System.out.println("============== 【" + userId + "】的未办理的任务列表 =============");
    		for (Task t : list) {
    			System.out.println("id=" + t.getId()//
    					+ ", name=" + t.getName()// 任务的名称
    					+ ", assignee=" + t.getAssignee()// 任务的办理人
    					+ ", createTime=" + t.getCreateTime()// 任务的创建时间
    					+ ", executionId=" + t.getExecutionId()); // 所属的运行对象的id
    		}
    	}

    b) 查询组任务列表

    方式1

    taskService.findGroupTasks(userId);

    方式2 

    List<Task> list = processEngine.getTaskService()//
    			 .createTaskQuery()//
    			 .candidate(userId)//
    			 .list();

    4.办理任务

    a) 正常完毕任务

    @Test
    	public void completeTask() {
    		String taskId = "180009";
    		//普通的方法
    		processEngine.getTaskService().completeTask(taskId);
    		//指定下一步的方法
    		processEngine.getTaskService().completeTask(taskId, outcome);
    		//设置流程变量的方法
    		processEngine.getTaskService().completeTask(taskId, outcome, variables);
    	}

    b) 自行控制完毕任务后是否向后流转(少用)

    String taskId = "120001";
    	// 1,设置为false代表:办理完任务后不向后移动(默觉得true)
    	TaskImpl taskImpl = (TaskImpl) processEngine.getTaskService().getTask(taskId);
    	taskImpl.setSignalling(false);
    	// 2,办理完任务
    	processEngine.getTaskService().completeTask(taskId);

    5.拾取任务(少用)

    a) TaskService.takeTask(taskId, userId),拾取组任务到个人任务列表中。假设任务有assignee,则会抛异常。

    b) processEngine.getTaskService().assignTask(taskId, userId),转交任务给其它人,(假设任务有assignee,则运行这种方法代表又一次分配。也能够把assignee设为null表示组任务没有人办理了)

    6.设置与获取流程变量

    a) 方式1:依据 executionId 设置或获取流程变量

    ExecutionService.setVariable(executionId, name, value);
    	Object obj = executionService.getVariable(executionId, "请假人");

    b) 方式2:依据 taskId 设置或获取流程变量

    TaskService.setVariables(taskId, variables); // 一次设置多个变量
    	Object obj = executionService.getVariable(executionId, "请假人");

    7.直接结束流程实例(手工)

    String processInstanceId = 	"test.10001";
    	processEngine.getExecutionService().endProcessInstance(processInstanceId, ProcessInstance.STATE_ENDED);


  • 相关阅读:
    NHibernate使用之详细图解
    iBatis for Net 代码生成器(CodeHelper)附下载地址(已经升级为V 1.1)
    设置devenv命令的启动版本
    NBear简介与使用图解
    jQuery 插件取url参数[jquery.url.js]的使用以及文件下载
    Ajax跨子域
    XML 通用操作
    NVelocity标签使用详解
    Visual Studio 2010 中JS注释制作
    windows自定义快速启动(运行)命令
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5353748.html
Copyright © 2020-2023  润新知