官网地址:https://www.flowable.org/
Flowable6.3中文教程:https://tkjohn.github.io/flowable-userguide/#_introduction
Flowable有五大引擎,每个之间都是相互独立互不影响。
ProcessEngine是里面最核心也是最重要的一个引擎,如果失去它那Flowable也就意义了
Flowable 整体是通过ProcessEngine进行操作的,不管整合什么框架都需要使用该类进行操作
ProcessEngine
可以发现其中包含了多个service
分别是
- ManagementService:管理引擎,比如表的元数据,创建删除表,执行自定义的sql等操作
- HistoryService:对历史记录进行管理
- RepositoryService:管理流程定义
- RuntimeService:管理流程实例,比如启动,步进,删除等操作
- IdentityService:身份管理
- TaskService:任务管理
- FormService:任务表单管理
- DynamicBpmnService:动态修改Bpmn的流程定义
流程引擎使用
Flowable引擎在使用前需要先通过配置来初始化ProcessEngine。
初始化ProcessEngineConfiguration一般有两种方式:
- 通过Spinrg配置文件进行依赖注入,通过flowable.cfg.xml文件来初始化ProcessEngineConfiguration(这里的文件名必须为flowable.cfg.xml,否则Flowable识别不到)
- 通过编写程序的方式来构造ProcessEngineConfiguration对象
权限接入
用户id => 获取到租户id、角色id集、部门id集
单用户(assignee="用户id")、多用户(candidateUsers="用户id1,用户id2")
单角色、多角色(candidateGroups=":角色id1,:角色id2")
单部门、多部门(candidateGroups="部门id1:,部门id2:")
角色或部门(candidateGroups="角色id1:, :部门id1")
角色且部门
常见服务简介
RepositoryService
流程建立相关,和数据库进行交互的服务类
- 主要操作流程的定义,操作,部署,删除
- 流程文件的查询,验证BpmnModel
- 流程文件转换BpmnModel
- BpmnModel转换为流程定义文件
```java
//伪代码。关键代码
// 验证bpmnModel
List
validationErrors = repositoryService.validateProcess(bpmnModel);
//流程的查询 repositoryService.createProcessDefinitionQuery().processDefinitionName(route.getId().toString()).singleResult();
// 通过bpmnmodel定义流程并部署流程 Deployment deployment = repositoryService.createDeployment().addBpmnModel(bpmnModel.getProcesses().get(0).getName()+”.bpmn”, bpmnModel).deploy();
//将流程转成bpmnModel repositoryService.getBpmnModel(processDefinition.getId());
//根据processDef上的deploymentId获取流程定义生成的bpmn文件或者其他资源文件。 InputStream inputStream = repositoryService.getResourceAsStream(deploymentId, resourceName);
// 删除流程定义 repositoryService.deleteDeployment(processDefinition.getDeploymentId(), cascade);
<a name="FQAA8"></a>
### RuntimeService
对流程实例进行管理操作
- 启动流程实例
- 步进到下一节点
- 删除流程实例
- 获取当前实例状态
```java
// 启动实例。businessId为业务号,一般唯一。比如lotId。商品编码。业务层方便查找
runtimeService.startProcessInstanceById(processDefinition.getId(), businessId);
// trigger形式的过站 只适用于ReceiveTask S1表示当前流程所在的taskId
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceBusinessKey(businessId).singleResult();
Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S1").singleResult();
runtimeService.trigger(execution.getId());
HistoryService
流程历史查询
所有有关历史的查询都会通过该类进行操作
// 整个业务的持续时间
List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().processInstanceBusinessKey(lotId).list();
String instanceId = "";
for (HistoricProcessInstance hpi : list) {
instanceId = hpi.getId();
System.out.println("流程定义文件->" + hpi.getProcessDefinitionId());
System.out.println("ProcessInstance->" + hpi.getId());
System.out.println("StartActivityId->" + hpi.getStartActivityId());
System.out.println("EndActivityId->" + hpi.getEndActivityId());
System.out.println("startTime ->" + hpi.getStartTime() + "EndTime->" + hpi.getEndTime() + "duration" + hpi.getDurationInMillis());
}
//业务流转过程中每站的记录
List<HistoricActivityInstance> list1 = historyService.createHistoricActivityInstanceQuery().processInstanceId(instanceId).list().stream().sorted(Comparator.comparing(HistoricActivityInstance :: getStartTime)).collect(Collectors.toList());
for (HistoricActivityInstance historicActivityInstance : list1) {
System.out.println("------");
System.out.println(historicActivityInstance.getActivityId());
System.out.println(historicActivityInstance.getActivityName());
System.out.println(historicActivityInstance.getActivityType());
System.out.println("startTime ->" +historicActivityInstance.getStartTime() + "EndTime->" + historicActivityInstance.getEndTime() + "duration" + historicActivityInstance.getDurationInMillis());
}
TaskService
用于指定节点任务的主要Service ,
比如ReceiveTask,UserTask,MailTask,HttpTask等
不同的task具备不同的处理方式
Execution execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S1").singleResult();
runtimeService.trigger(execution.getId());
execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S2").singleResult();
runtimeService.trigger(execution.getId());
execution = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).activityId("S3").singleResult();
runtimeService.trigger(execution.getId());
构建流程
通过流程定义文件bpmn文件
可以通过各种方式定义和保存流程实例为bpmn文件,并放入项目的classpath目录下进行部署
public static final String[] BPMN_RESOURCE_SUFFIXES = new String[] { "bpmn20.xml", "bpmn" };
public static final String[] DIAGRAM_SUFFIXES = new String[] { "png", "jpg", "gif", "svg" };
提供bpmn模型构建(推荐)
通过前端提供的组件可以可视化的绘制bpmn模型
具体参考:https://www.yuque.com/docs/share/6fba0ef2-ccf1-40a6-a4e7-4029920e1367?# 《bpmn前端组件》
也可以通过flowable的BpmnModel进行定义模型
BpmnModel bpmnModel = new BpmnModel();
StartEvent start = new StartEvent();
start.setId("start1");
start.setName("开始节点");
SequenceFlow flow1 = new SequenceFlow();
3eflow1.setId("flow1");
flow1.setName("开始节点-->任务节点1");
flow1.setSourceRef("start1");
flow1.setTargetRef("receiveTask1");
ReceiveTask receiveTask1 = vbnew ReceiveTask();
receiveTask1.setId("receiveTask1");
receiveTask1.setName("节点1");
SequenceFlow flow2 = new SequenceFlow();
flow2.setId("flow2");
flow2.setName("节点1-->结束节点");
flow2.setSourceRef("receiveTask1");
flow2ow1.setTargetRef("endEvent");
EndEvent end = new EndEvent();
endEvent.setId("endEvent");
endEvent.setName("结束节点");
Process process=new Process();
process.setId("process1");
process.setName("process1");
process.addFlowElement(start);
process.addFlowElement(flow1);
process.addFlowElement(receiveTask1);
process.addFlowElement(flow2);
process.addFlowElement(end);
bpmnModel.addProcess(process);
repositoryService.createDeployment().addBpmnModel(bpmnModel.getProcesses().get(0).getName()+".bpmn", bpmnModel).deploy();
表结构
Flowable的表结构和Activiti类似,会在程序启动之后生成79张数据表
命名规则如下:
- ACTRE* :’RE’表示repository(存储),存储RepositoryService接口操作的表
带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。
- ACTRU* :’RU’表示runtime。(15张表)这是运行时的表
存储着流程变量,用户任务,变量,职责(job)等运行时的数据。flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。
- ACTID* :’ID’表示identity(组织机构)。(9张表)这些表包含标识的信息,如用户,用户组,等等。
- ACTHI* :’HI’表示history。(10张表)就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。
- ACTGE* :普通数据。(2张表)各种情况都使用的数据。
- *_ DATABASECHANGELOG: liuquibase的log表(4张表)
- _DATABASECHANGELOGLOCK: liuquibase的log_Lock表(4张表)
日志配置级别
- none: 不保存任何历史记录,可以提高系统性能;
- activity:保存所有的流程实例、任务、活动信息;
- audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;
- full:最完整的历史记录,除了包含audit级别的信息之外还能保存详细,例如:流程变量。
通用数据表
| 数据表 | 描述 | | —- | —- | | ACT_GE_PROPERTY | 属性表(保存流程引擎的kv键值属性)
—PropertyEntityImpl
Flowable相关的基本信息。比如各个module使用的版本信息 | | ACT_GE_BTYEARRAY | 资源表(存储流程定义相关的资源)
—ByteArrayEntityImpl
保存流程的bpmn的xml以及流程的Image缩略图等信息 |
流程定义存储表
RepositoryService操作
数据表 | 描述 |
---|---|
ACT_RE_DEPLOYMENT | 流程部署表 —DeploymentEntityImpl 部署对象,存储流程名称 租户相关 |
ACT_RE_PROCDEF | 流程定义信息表 —ProcessDefinitionEntityImpl |
ACT_RE_MODEL | 模型信息表(用于Web设计器) —ModelEntityImpl |
ACT_PROCDEF_INFO | 流程定义动态改变信息表 —ProcessDefinitionInfoEntityImpl |
身份数据表
IdentityService操作
如果系统的权限系统使用的不是flowable自带的权限,则该数据表可以不创建
数据表 | 描述 |
---|---|
ACT_ID_USER | 用户基本信息表 —UserEntityImpl |
ACT_ID_INFO | 用户扩展表 —IdentityInfoEntityImpl |
ACT_ID_GROUP | 群组表(用于Web设计器) —GroupEntityImpl |
ACT_ID_MEMBERSHIP | 用户与群组关系表 —MemberShipEntityImpl |
ACT_ID_BYTEARRAY | 二进制数据表(flowable) — |
ACT_ID_PRIV | 权限表(flowable) — |
ACT_ID_PRIV_MAPPING | 用户或组权限关系表(flowable) — |
ACT_ID_PROPERTY | 属性表(flowable) — |
ACT_ID_TOKEN | 系统登录日志表(flowable) — |
运行时流程数据表
RuntimeService操作
数据表 | 描述 |
---|---|
ACT_RU_EXECUTION | 流程实例与分支执行表 —ExecutionEntityImpl 运行的实例表 |
ACT_RU_TASK | 用户任务表 —TaskEntityImpl |
ACT_RU_VARIABLE | 流程变量信息表 —VariableInstanceEntityImpl |
ACT_RU_IDENTITYLINK | 参与者相关信息表 —IdentityLinkEntityImpl |
ACT_RU_EVENT_SUBSCR | 事件订阅表 —EventSubscriptionEntityImpl 运行时的事件 |
ACT_RU_JOB | 作业表 —JobEntityImpl |
ACT_RU_TIMER_JOB | 定时器表 —TimerJobEntityImpl |
ACT_RU_SUSPENDED_JOB | 暂停作业表 —SuspendedJobEntityImpl |
ACT_RU_DEADLETTER_JOB | 死信表 —DeadLetterJobEntityImpl 当JOB执行很多次都无法执行,就会被记录在此表 |
ACT_RU_HISTORY_JOB | 历史作业表(flowable) — |
历史流程信息表
HistoryService
数据表 | 描述 |
---|---|
ACT_HI_PROCINST | 历史流程实例表 —HistoricProcessInstanceEntityImpl |
ACT_HI_ACTINST | 历史节点信息表 —HistoricActivityInstanceEntityImpl |
ACT_HI_TASKINST | 历史任务表 —HistoricTaskInstanceEntityImpl(只记录usertask内容) |
ACT_HI_VARINST | 历史变量 —HistoricVariableInstanceEntityImpl |
ACT_HI_IDENTITYLINK | 历史参与者表 —HistoricIdentityLinkEntityImpl |
ACT_HI_DETAIL | 历史的流程运行中的细节信息 —HistoricDetailEntityImpl |
ACT_HI_ATTACHMENT | 附件表 —AttachmentEntityImpl |
ACT_HI_COMMENT | 评论表 —CommentEntityImpl |
ACT_EVT_LOG | 事件日志表 —EventLogEntryEntityImpl |
Flowable相关表
FLW_CHANNEL_DEFINITION | 泳池管道定义表 |
---|---|
FLW_EVENT_DEFINITION | 事件定义 |
FLW_EVENT_DEPLOYMENT | 事件部署 |
FLW_EVENT_RESOURCE | 事件所需资源 |
FLW_EV_DATABASECHANGELOG | Liquibase执行的记录 |
FLW_EV_DATABASECHANGELOGLOCK | Liquibase执行的记录 |
FLW_RU_BATCH | 批量运行 |
FLW_RU_BATCH_PART | 批量运行 |
附录:
https://wwv.flowable.com/open-source/docs/bpmn/ch05a-Spring-Boot/