目录
Activity笔记
Activity7
Activity介绍
Alfresco 软件在 2010 年 5 月 17 日宣布 Activiti业务流程管理(BPM)开源项目的正式启动, 其首席架构师由业务流程管理 BPM 的专家 Tom Baeyens 担任, Tom Baeyens 就是原来 jbpm 的架构师,而 jbpm 是一个非常有名的工作流引擎,当然 Activiti也是一个工作流引擎。
Activiti是一个工作流引擎, Activiti可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言(BPMN2.0)进行定义,业务系统按照预先定义的流程进行执行,实现了业务系统的业务流程由 Activiti进行管理,减少业务系统由于流程变更进行系统升级改造的工作量,从而提高系统的健壮性,同时也减少了系统开发维护成本。
BPM
BPM(Business Process Management),即业务流程管理,是一种以规范化的构造端到端的卓越业务流程为中心,以持续的提高组织业务绩效为目的系统化方法,常见商业管理教育如 EMBA、MBA等均将 BPM 包含在内。
企业流程管理主要是对企业内部改革,改变企业职能管理机构重叠、中间层次多、流程不闭环等,做到机构不重叠、业务不重复,达到缩短流程周期、节约运作资本、提高企业效益的作用。
BPM 软件
BPM 软件就是根据企业中业务环境的变化,推进人与人之间、人与系统之间以及系统与系统之间的整合及调整的经营方法与解决方案的 IT 工具。 通常以 Internet 方式实现信息传递、数据同步、业务监控和企业业务流程的持续升级优化,从而实现跨应用、跨部门、跨合作伙伴与客户的企业运作。 通过 BPM 软件对企业内部及外部的业务流程的整个生命周期进行建模、自动化、管理监控和优化,使企业成本降低,利润得以大幅提升。
BPMN
BPMN(Business Process Model And Notation) - 业务流程模型和符号, 是由 BPMI(BusinessProcess Management Initiative)开发的一套标准的业务流程建模符号,使用 BPMN 提供的符号可以创建业务流程。 2004 年 5 月发布了 BPMN1.0 规范.BPMI 于 2005 年 9 月并入 OMG(The ObjectManagement Group 对象管理组织)组织。
Spring Boot 整合Activity
引入依赖
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M2</version>
</dependency>
配置activity相关属性
spring:
# activiti工作流配置
activiti:
db-history-used: true
check-process-definitions: false #自动检查、部署流程定义文件
database-schema-update: true #自动更新数据库结构
history-level: full #保存历史数据级别设置为full最高级别,便于历史数据的追溯
process-definition-location-prefix: classpath:/processes/ #流程定义文件存放目录
process-definition-location-suffixes: #流程文件格式
- .bpmn20.xml
- .bpmn
安装 Activiti BPMN visualizer 插件
数据库
ACT_RE_*: 'RE’表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU’表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID’表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI’表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。
1.资源库流程规则表
- act_re_deployment 部署信息表
存放流程定义的显示名和部署时间,每部署一次增加一条记录 - act_re_model 流程设计模型部署表
- act_re_procdef 流程定义数据表
部署每个新的流程定义都会在这张表中增加一条记录。
注意:当流程定义的key相同的情况下,使用的是版本升级
2.运行时数据库表
- act_ru_execution 运行时流程执行实例表
正在执行的信息 - act_ru_identitylink 运行时流程人员表
主要存储任务节点与参与者的相关信息 - act_ru_task 运行时任务节点表
- act_ru_variable 运行时流程变量数据表
3.历史数据库表
- act_hi_actinst 历史节点表
存放历史所有完成的活动 - act_hi_attachment 历史附件表
- act_hi_comment 历史意见表
- act_hi_identitylink 历史流程人员表
- act_hi_detail 历史详情表,提供历史变量的查询
- act_hi_procinst 历史流程实例表
已经执行完的历史流程实例信息 - act_hi_taskinst 历史任务实例表
- act_hi_varinst 历史变量表
4.组织机构表
- act_id_group 用户组信息表
- act_id_info 用户扩展信息表
- act_id_membership 用户与用户组对应信息表
- act_id_user 用户信息表
5.通用数据表
- act_ge_bytearray 二进制数据表
即流程定义文档的存放地。
每部署一次就会增加两条记录,一条是关于bpmn规则文件的,一条是图片的(如果部署时只指定了bpmn一个文件,activiti会在部署时解析bpmn文件内容自动生成流程图) - act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
主键生成策略表
ProcessEngine 流程引擎
Servic | 作用 |
---|---|
RepositoryService | 管理流程定义 |
RuntimeService | 执行管理,包括启动、推进、删除流程实例等操作 |
TaskService | 任务管理 |
HistoryService | 历史管理(执行完的数据的管理) |
IdentityService | 组织机构管理 |
FormService | 一个可选服务,任务表单管理 |
ManagerService | 引擎管理 |
RepositoryService
指流程定义文档的两个文件:bpmn文件和流程图片
@Test
void deploy(){
// 获取仓库服务,从类路径下完成部署
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("processes/test.bpmn.xml") // 添加定义的规则文件
.addClasspathResource("processes/test.png") // 添加定义的规则图片
.name("提交合同审批") // 部署规则的别名
.key("test-flow")
.deploy();
System.out.println("流程部署id:" + deployment.getId());
System.out.println("流程部署名称:" + deployment.getName());
System.out.println("key:"+deployment.getKey());
}
RuntimeService
ProcessInstance 流程实例
一个流程实例包括了所有的运行节点。可以通过这个对象来了解当前流程实例的进度等信息。
流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个。Execution 执行对象
描述流程执行的每一个节点。在没有并发的情况下,Execution就是同ProcessInstance。
流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution。
对应的表:
act_ru_execution: 正在执行的信息
act_hi_procinst:已经执行完的历史流程实例信息
act_hi_actinst:存放历史所有完成的活动
一个流程中,执行对象可以存在多个,但是流程实例只能有一个。
@Test
public void startProcess(){
//获得流程执行服务类对象
RuntimeService runServ = processEngine.getRuntimeService();
//启动流程
ProcessInstance pi = runServ.startProcessInstanceByKey("test");
System.out.println(pi.getId()+","+pi.getActivityId()+","+pi.getProcessDefinitionId()+","+pi.getProcessDefinitionKey()
+","+pi.getProcessDefinitionName()+","+pi.getBusinessKey()+","+pi.getName()+","+pi.getDeploymentId());
}
TaskService
Task任务:执行到某任务环节时生成的任务信息。对应的表:
act_ru_task:正在执行的任务信息
act_hi_taskinst:已经执行完的历史任务信息
/**
* 查看代办任务
*/
@Test
public void getTodoTask() {
//获取一个TaskService对象
TaskService taskService = processEngine.getTaskService();
//查询代办业务
List<Task> list = taskService.createTaskQuery() //查询任务
.taskAssignee("小张") // 查询待办个人任务
// .taskCandidateOrAssigned("lisi") // 查询所有待办任务(个人、组任务)
// .taskCandidateUser("小张")// 查询待办组任务
.processDefinitionKey("test") //processDefinitionKey:查询流程
.list();
}
HistoryService
在一个流程执行完成后,这个对象为我们提供查询历史信息。
/**
* 查询历史流程实例 HistoricProcessInstance
*/
@Test
public void findHistoryProcessInstance(){
// String processInstanceId="8769f060-0be4-11ee-a0d2-38d57a012850";
List<HistoricProcessInstance> list = processEngine.getHistoryService() //与历史数据(历史表)相关的Service
.createHistoricProcessInstanceQuery() //创建历史流程实例查询
// .processInstanceId(processInstanceId) //使用流程实例ID查询
.orderByProcessInstanceStartTime().asc()
.list();
}
流程变量
流程变量:在流程执行或者任务执行的过程中,用于设置和获取变量,使用流程变量在流程传递的过程中传递业务参数。
对应的表:
act_ru_variable:正在执行的流程变量表
act_hi_varinst:流程变量历史表
- setVariable和setVariableLocal的区别:
- setVariable:节点通用变量,流程变量名称相同的时候,后一次的值替换前一次的值。
- setVariableLocal:针对当前活动的节点设置流程变量。例如act_hi_varinst 表的数据:不同的任务节点,即使流程变量名称相同,存放的值也是不同的。
@Test
public void startProcess(){
//获得流程执行服务类对象
RuntimeService runServ = processEngine.getRuntimeService();
//启动流程的时候【动态设置每个步骤的执行人】,map的key值需要与Leave.bpmn中对应
Map<String, Object> variables=new HashMap<String, Object>();
variables.put("user1", "张三");
variables.put("user2", "李四");
//启动流程得到流程实例,对应act_ru_execution表
ProcessInstance pi= runServ.startProcessInstanceByKey("test","aaa", variables);
流程分支
一个活动中可以指定一个或多个SequenceFlow(Start中有一个,End中没有)。
开始活动中有一个SequenceFlow 。
结束活动中没有SequenceFlow 。
其他活动中有1条或多条SequenceFlow
如果有多个,则需要使用流程变量设置codition的名称。${}中间的内容要使用boolean类型的表达式,用来判断应该执行的连线。
排它网关(X)
- 一个排他网关对应一个以上的顺序流
- 由排他网关流出的顺序流都有个conditionExpression元素,在内部维护返回boolean类型的决策结果。
- 决策网关只会返回一条结果。当流程执行到排他网关时,流程引擎会自动检索网关出口,从上到下检索如果发现第一条决策结果为true或者没有设置条件的(默认为成立),则流出。
- 如果没有任何一个出口符合条件,则抛出异常
使用流程变量,设置连线的条件,并按照连线的条件执行工作流,如果没有条件符合的条件,则以默认的连线离开。
并行网关(parallelGateWay) (+)
说明:
一个流程中流程实例只有1个,执行对象有多个
并行网关的功能是基于进入和外出的顺序流的:
- 分支(fork): 并行后的所有外出顺序流,为每个顺序流都创建一个并发分支。
- 汇聚(join): 所有到达并行网关,在此等待的进入分支, 直到所有进入顺序流的分支都到达以后, 流程就会通过汇聚网关。
- 并行网关的进入和外出都是使用相同节点标识
- 如果同一个并行网关有多个进入和多个外出顺序流, 它就同时具有分支和汇聚功能。 这时,网关会先汇聚所有进入的顺序流,然后再切分成多个并行分支。
- 并行网关不会解析条件。 即使顺序流中定义了条件,也会被忽略。
用户任务、组任务、监听器
个人任务和组任务存放办理人对应的表:
act_ru_identitylink表存放任务的办理人,包括个人任务和组任务,表示正在执行的任务
act_hi_identitylink表存放任务的办理人,包括个人任务和组任务,表示历史任务
区别在于:如果是个人任务TYPE的类型表示participant(参与者)
如果是组任务TYPE的类型表示candidate(候选者)和participant(参与者)
个人任务
- 三种分配方式:
方式一:直接指定办理人。在taskProcess.bpmn中直接写 assignee=“小红"。
方式二:使用流程变量指定办理人。在taskProcess.bpmn中写 assignee=“#{userID}”,变量的值要是String的。
方式三:使用监听器类,实现TaskListener接口.
delegateTask.setAssignee(assignee);// 指定个人任务的办理人
使用任务ID和办理人重新指定办理人: processEngine.getTaskService().setAssignee(taskId, userId);
组任务
方式一:直接指定办理人。在taskProcess.bpmn中直接写 candidate-users=“小A,小B,小C,小D"。
方式二:使用流程变量指定。在taskProcess.bpmn中写 candidate-users =“#{userIDs}”,变量的值要是String的。
方式三:使用监听器类,实现TaskListener接口,在类中定义。