目录
3、流程实例
3.1、什么是流程实例
3.2、让实际业务与activiti表关联(BusinessKey)
3.3、挂起,激活流程实例
3.3.1、全部流程实例挂起
3.3.2、单个流程实例挂起
4、任务分配
4.1、固定分配
4.2、表达式分配
4.2.1、UEL-value
4.2.2、UEL-method 方式
4.3、监听器分配
基本操作参考:Activiti的基本使用_Relievedz的博客-CSDN博客
流程定义ProcessDefinition和流程实例ProcessInstance是Activiti重要的概念,类似于Java类和Java实例的关系
启动一个流程实例表示开始一次业务流程的运行,比如员工请假流程部署完成,如果张三要请假就可以启动一个流程实例,如果李四要请假也启动一个流程实例,两个流程的执行互相不影响,就好比定义一个 java 类,实例化两个对象一样,部署的流程就好比 java 类,启动一个流程实例就好比 new 一个 java 对象
比如我们填写一个请假单,一定会有一个请假单的唯一标识,我们通常使用这个标识来关联activiti,这个标识在activiti中称为businesskey
BusinessKey:业务标识,通常为业务的主键,业务标识和流程标识一一对应,业务标识来源于业务系统,存储业务标识就是根据业务标识来关联查询业务系统的数据
举例:请假流程启动一个流程实例,就可以将请假单的id作为业务标识存储到activiti中,将来查询activiti的流程实例信息就可以获取请假单的id从而关联查询业务系统数据库得到请假单信息
/** * 启动流程实例,添加businessKey */ @Test public void startUpProcessAddBusinessKey(){ String businessKey = "1"; // 启动流程实例,指定业务标识businessKey,也就是请假申请单id ProcessInstance processInstance = runtimeService. startProcessInstanceByKey("qingjia",businessKey); // 输出 System.out.println("业务id:"+processInstance.getBusinessKey()); }
某些情况可能由于流程变更需要将当前运行的流程暂停而不是直接删除,流程暂停后将不会执行;
操作流程定义为挂起状态,该流程定义下面的所有流程实例全部暂停: 流程定义为挂起状态,该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行
//全部流程实例挂起 @Test public void suspendProcessInstanceAll() { //1 获取流程定义的对象 ProcessDefinition qingjia = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("qingjia").singleResult(); //2 调用流程定义对象的方法判断当前状态:挂起 激活 boolean suspended = qingjia.isSuspended(); //3 判断如果挂起,实现激活 if(suspended) { //第一个参数 流程定义id //第二个参数 是否激活 true //第三个参数 时间点 repositoryService .activateProcessDefinitionById(qingjia.getId(), true,null); System.out.println(qingjia.getId()+"激活了"); } else { //如果激活,实现挂起 repositoryService .suspendProcessDefinitionById(qingjia.getId(), true,null); System.out.println(qingjia.getId()+"挂起"); } }
操作流程实例对象,针对单个流程执行挂起操作,某个流程实例挂起则此流程不在继续执行,完成该流程实例的当前任务将报异常;
//单个流程实例挂起 @Test public void SingleSuspendProcessInstance() { String processInstanceId = "b98e42b3-df27-11ed-b184-005056c00001"; ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); boolean suspended = processInstance.isSuspended(); if (suspended) { //激活 runtimeService.activateProcessInstanceById(processInstanceId); System.out.println(processInstanceId + "激活"); } else { runtimeService.suspendProcessInstanceById(processInstanceId); System.out.println(processInstanceId + "挂起"); } }
任务分配有三种方式
固定分配
UEL表达式分配
监听器分配
在前面进行业务流程建模时指定固定的任务负责人,如:Assignee:zhangsan/lisi
activiti使用UEL表达式,UEL是java EE6规范的一部分,UEL即统一表达式语言,activiti支持两个UEL表达式:UEL-value和UEL-method。
新建:一个加班流程
如图:
assignee1 这个变量是 activiti 的一个流程变量
我们启动流程实例,这个启动实例的方法跟之前的方法基本一致,唯一的不同是在启动时,添加了一个参数
@Test public void deployProcess01() { // 流程部署 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("process/jiaban.bpmn20.xml") .name("加班申请流程") .deploy(); System.out.println(deploy.getId()); System.out.println(deploy.getName()); } /** * 启动流程实例 */ @Test public void startUpProcess01() { Mapmap = new HashMap<>(); map.put("assignee1","lucy"); map.put("assignee2","mary"); //创建流程实例,我们需要知道流程定义的key ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("jiaban", map); //输出实例的相关信息 System.out.println("流程定义id:" + processInstance.getProcessDefinitionId()); System.out.println("流程实例id:" + processInstance.getId()); }
如图:
userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUsername(int id)方法。
经理审批:${userBean.getUsername(1)}
人事审批:${userBean.getUsername(2)}
package com.atguigu.auth.activiti; import org.springframework.stereotype.Component; /** * @program: guigu-oa-perent * @description: userBean 是 spring 容器中的一个 bean,表示调用该 bean 的 getUsername(int id)方法。 * @author: Mr.Zhang * @create: 2023-04-20 11:42 **/ @Component public class UserBean { public String getUsername(int id) { if(id == 1) { return "lilei"; } if(id == 2) { return "wyz"; } return "admin"; } }
部署与启动
/ //uel-method @Test public void deployProcess01() { Deployment deployment = repositoryService.createDeployment() .addClasspathResource("process/jiaban01.bpmn20.xml") .name("加班申请流程01") .deploy(); System.out.println(deployment.getId()); System.out.println(deployment.getName()); } @Test public void startProcessInstance01() { ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("jiaban01"); System.out.println(processInstance.getProcessDefinitionId()); System.out.println(processInstance.getId()); }
启动流程实例,就会调用bean方法,参数为:1,经理审批后,接着调用bean方法,参数为:2
使用监听器的方式来指定负责人,那么在流程设计时就不需要指定assignee。
任务监听器是发生对应的任务相关事件时执行自定义 java 逻辑 或表达式
Event的选项包含:
Create:任务创建后触发 Assignment:任务分配后触发 Delete:任务完成后触发 All:所有事件发生都触发
定义任务监听类,且类必须实现 org.activiti.engine.delegate.TaskListener 接口