02.activiti第一天: 09-10.流程实例, 任务, 执行对象控制流程的执行

项目: cn.itcast.c_processInstance

1. 流程核心对象-流程引擎: ProcessEngine

2. 部署流程的定义(通过zip)

     @Test
     public void deploymentProcessDefinition_zip(){
     	InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/helloworld.zip");
     	ZipInputStream zipInputStream = new ZipInputStream(in);
     	Deployment deployment = processEngine.getRepositoryService()// 与流程定义和部署对象相关的Service
     			.createDeployment()// 创建一个部署对象
     			.name("流程定义")// 添加部署名称
     			.addZipInputStream(zipInputStream)// 指定zip格式的文件完成部署
     			.deploy();// 完成部署
     	System.out.println("部署ID: " + deployment.getId());
     	System.out.println("部署名称: " + deployment.getName());

     } 

部署对象和流程定义相关的表
act_re_deployment     部署对象表
act_re_procdef      流程定义表
act_ge_bytearray     资源文件表
act_ge_property       主键生成策略表

3. 启动流程实例

  @Test
  public void startProcessInstance(){
  	// 流程定义的key(可查看流程定义表)
  	String processDefinitionKey = "helloworld";
  	ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
  	    // 使用流程定义的key启动流程实例, key对应helloworld.bpmn文件中id的属性值
  			.startProcessInstanceBykey(processDefinitionKey);
  	System.out.println("流程实例ID: " + pi.getId());// 流程实例ID 1001(?到底是执行对象ID还是流程实例ID(PROC_INST_ID))
  	System.out.println("流程定义ID: " + pi.getProcessDefinitionId());// 流程定义ID helloworld:1:4

  }
  • 注1: 不采用流程实例ID启动, 是因为key是个定值, ID是个生成值, 且使用key启动会默认启动最新版本.

流程实例, 执行对象, 任务相关表
act_ru_execution  正在执行的执行对象表
act_hi_procinst     流程实例的历史表
act_ru_task    正在执行的任务表(只有节点是UserTask的时候, 该表存在数据)
act_hi_taskinst   历史任务表(只有节点是UserTask的时候, 该表存在数据, 包含完成和未完成的)
act_hi_actinst     所有活动节点的历史表(相对历史任务表, 包括非任务节点)

  • 注2: 查询act_ru_execution发现ID(执行对象ID)PROC_INST_ID(流程实例ID) 两字段相同, 但其实实际情况 并不一定相同 1.
  • 流程实例 processInstance执行对象 execution:
    在这里插入图片描述

  • 流程实例的历史表 act_hi_procinst 结构:
    在这里插入图片描述

  • 正在执行的任务表 act_ru_task的表结构:
    在这里插入图片描述

  • 历史任务表 act_hi_taskinst的表结构:

在这里插入图片描述
在这里插入图片描述

  • 所有活动节点的历史表 act_hi_actinst的表结构:
    在这里插入图片描述在这里插入图片描述

4. 查询当前人的个人任务

  public void findMyPersonalTask(){
  	String assignee = "王五";
  	List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的Service
  			.createTaskQuery()// 创建任务查询对象
  			/** 查询条件(where部分) */
  			.taskAssignee(assignee)// 指定个人任务查询, 指定办理人
  			//.taskCandidateUser(assignee)// 组任务办理人查询 
  			//.processDefinitionId(processDefinitionId)// 使用流程定义ID查询
  			//.processInstanceId(processInstanceId)// 使用流程实例ID查询
  			//executionId(executionId)// 使用执行对象ID查询
  			/** 排序 */
  			//.orderBy*().asc()// 按照*升序
  			/** 返回结果集 */
  			//.singleResult()// 返回唯一结果集
  			//.count()// 返回结果集的数量
  			//.listPage(firstResult, maxResults)// 分页查询
  			.list();// 返回列表

    if (list != null && list.size() > 0) {
		System.out.println("任务ID: " + task.getId());
		System.out.println("任务名称: " + task.getName());
		System.out.println("任务创建时间: " + task.getCreateTime());
		System.out.println("任务办理人: " + task.getAssignee());
		System.out.println("流程实例ID: " + task.getProcessInstanceId());
		System.out.println("执行对象ID: " + task.getExecutionId());
		System.out.println("流程定义ID: " + task.getProcessDefinitionId());         
	}
  }

5. 完成我的任务

  	  public void completeMyPersonalTask() {
  	  	// 任务ID
  	  	String taskId = "1004";
  	  	processEngine.getTaskService()// 与正在执行的任务管理相关的Service
  	  		.complete(taskId);
  	  	System.out.println("完成任务! 任务ID: " + taskId);
  	  }

6. 查询流程状态(判断流程正在执行, 还是结束了)

  public void getProcessStatus() {
    String processInstanceId = "1001";
    ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象有关的service
    	.createProcessInstanceQuery()// 创建流程实例查询
    	.processInstanceId(processInstanceId)// 使用流程实例ID查询
    	.singleResult();

    if (pi == null) {
    	System.out.println("流程已经结束.");
    } else {
     	System.out.println("流程正在执行.");
    }
  }

7. 查询历史任务

  public void getHistoryTask() {
    String taskAssignee = "张三";
    List<HistoricTaskInstance> list = processEngine.getHistoryService()// 与历史数据(历史表)相关的service
      .createHistoricTaskInstanceQuery()// 创建历史任务实例查询
      .taskAssignee(taskAssignee)// 指定历史任务的办理人
      .list();
    if (list != null) {
      for (HistoricTaskInstance hti : list) {
      	System.out.println(hti.getId());
      	System.out.println(hti.getName());
      	System.out.println(hti.getProcessInstanceId());
      	System.out.println(hti.getStartTime());
      	System.out.println(hti.getEndTime());
      	System.out.println(hti.getDurationInMillis());
      }
    }

  }  

8. 查询历史流程实例

  public void getHistoryProcessInstance() {
    String processInstanceId = "1001";
    HistoricProcessInstance hpi = processEngine.getHistoryService()// 与历史数据(历史表)相关的Service
      .createHistoricProcessInstanceQuery()//创建历史流程实例查询
      .processInstanceId(processInstanceId)// 使用流程实例ID查询
      .singleResult();
    System.out.println(hpi.getId());// 流程实例ID
    System.out.println(hpi.getProcessDefinitionId());// 流程定义ID
    System.out.println(hpi.getStartTime());
    System.out.println(hpi.getEndTime());
    System.out.println(hpi.getDurationInMillis());// 持续毫秒数
  }

  1. 如果是单例流程(没有分支和聚合), 那么 流程实例ID执行对象ID 是相同的.
    另: 一个流程 流程实例 processInstance(PROC_INST_ID) 只有一个, 执行对象 execution(ID)可以存在多个. ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值