官网地址:https://www.flowable.org/
Flowable6.3中文教程:https://tkjohn.github.io/flowable-userguide/#_introduction

Flowable有五大引擎,每个之间都是相互独立互不影响。
ProcessEngine是里面最核心也是最重要的一个引擎,如果失去它那Flowable也就意义了
Flowable 整体是通过ProcessEngine进行操作的,不管整合什么框架都需要使用该类进行操作

image.png

ProcessEngine

image.png
可以发现其中包含了多个service
分别是

  • ManagementService:管理引擎,比如表的元数据,创建删除表,执行自定义的sql等操作
  • HistoryService:对历史记录进行管理
  • RepositoryService:管理流程定义
  • RuntimeService:管理流程实例,比如启动,步进,删除等操作
  • IdentityService:身份管理
  • TaskService:任务管理
  • FormService:任务表单管理
  • DynamicBpmnService:动态修改Bpmn的流程定义

image.png


流程引擎使用

Flowable引擎在使用前需要先通过配置来初始化ProcessEngine。
初始化ProcessEngineConfiguration一般有两种方式:

  1. 通过Spinrg配置文件进行依赖注入,通过flowable.cfg.xml文件来初始化ProcessEngineConfiguration(这里的文件名必须为flowable.cfg.xml,否则Flowable识别不到)
  2. 通过编写程序的方式来构造ProcessEngineConfiguration对象

权限接入

  1. 用户id => 获取到租户id、角色id集、部门id
  2. 单用户(assignee="用户id")、多用户(candidateUsers="用户id1,用户id2"
  3. 单角色、多角色(candidateGroups=":角色id1,:角色id2"
  4. 单部门、多部门(candidateGroups="部门id1:,部门id2:"
  5. 角色或部门(candidateGroups="角色id1:, :部门id1"
  6. 角色且部门

常见服务简介

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张表)

日志配置级别

  1. none: 不保存任何历史记录,可以提高系统性能;
  2. activity:保存所有的流程实例、任务、活动信息;
  3. audit:也是Activiti的默认级别,保存所有的流程实例、任务、活动、表单属性;
  4. 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/