BPMN 2.0存储为XML,并包含可视化的部分:使用标准方式定义了每个步骤类型(人工任务,自动服务调用,等等)如何呈现,以及如何互相连接。这样BPMN 2.0标准使技术人员与业务人员能用双方都能理解的方式交流业务流程。
使用的流程定义示例为:
流程定义说明:
- 我们假定启动流程需要提供一些信息,例如雇员名字、请假时长以及说明。当然,这些可以单独建模为流程中的第一步。 但是如果将它们作为流程的“输入信息”,就能保证只有在实际请求时才会建立一个流程实例。否则(将提交作为流程的第一步),用户可能在提交之前改变主意并取消,但流程实例已经创建了。 在某些场景中,就可能影响重要的指标(例如启动了多少申请,但还未完成),取决于业务目标。
- 左侧的圆圈叫做启动事件(start event)。这是一个流程实例的起点。
- 第一个矩形是一个用户任务(user task)。这是流程中用户操作的步骤。在这个例子中,经理需要批准或驳回申请
- 取决于经理的决定,排他网关(exclusive gateway) (带叉的菱形)会将流程实例路由至批准或驳回路径
- 如果批准,则需要将申请注册至某个外部系统,并跟着另一个用户任务,将经理的决定通知给申请人。当然也可以改为发送邮件。
- 如果驳回,则为雇员发送一封邮件通知他。
spring-application 配置
yaml
flowable:
#关闭定时任务JOB
async-executor-activate: true
# 将databaseSchemaUpdate设置为true。当Flowable发现库与数据库表结构不一致时,会自动将数据库表结构升级至新版本。前提是数据库中只能有flowable-learn架构,架构中不能有表。
database-schema-update: true
基本操作
flowable 核心 api:
简单流程部署
java
@Autowired
private ProcessEngine processEngine;
/**
* 流程部署
*/
@Test
void deployFlow(){
Deployment deploy = processEngine.getRepositoryService().createDeployment()
.addClasspathResource("process/HolidayDemo1.bpmn20.xml") // 部署一个流程
.name("第一个流程案例")
.deploy();
System.out.println(deploy.getId());
}
启动流程实例
java
@Test
void startProcess(){
// 发起流程需要通过RuntimeService来实现
RuntimeService runtimeService = processEngine.getRuntimeService();
// 方法一:根据 act_re_procdef 表中的id
String processId = "Exanple01:2:a7de575b-a73b-11ef-a2cb-005056c00001";
// 根据流程定义Id启动 返回的是当前启动的流程实例 ProcessInstance
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processId);
System.out.println("processInstance.getId() = " + processInstance.getId());
// 方法二:根据流程图中定义的Key启动
// 构建流程变量
Map<String,Object> variables = new HashMap<>();
variables.put("employee","张三") ;// 谁申请请假
variables.put("nrOfHolidays",3); // 请几天假
variables.put("description","工作累了,想出去玩玩"); // 请假的原因
// 启动流程实例,第一个参数是流程定义的id
ProcessInstance processInstance = runtimeService
.startProcessInstanceByKey("holidayRequest", variables);// 启动流程实例
// 输出相关的流程实例信息
System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例的ID:" + processInstance.getId());
System.out.println("当前活动的ID:" + processInstance.getActivityId());
这时我们可以在act_ru_task表中看到对应的记录。act_ru_task记录的都是当前待办的记录信息
还有一个要注意的:每启动一个流程实例那么就会在act_hi_procinst表中维护一条记录。然后在act_ru_execution会记录流程的分支
流程审批
java
/**
* 待办任务查询
*/
@Test
void findTask(){
// 任务查询这块我们可以通过 TaskService 来实现
TaskService taskService = processEngine.getTaskService();
// 查询的其实就是 act_ru_task 中的记录
List<Task> list = taskService.createTaskQuery()
.taskAssignee("zhangsan") // 根据审批人来查询
.list();// 返回多条记录
for (Task task : list) {
System.out.println(task.getId());
}
}
/**
* 完成任务的审批
*/
@Test
void completeTask(){
TaskService taskService = processEngine.getTaskService();
// 需要审批的任务 Id
String taskId = "926b41f8-7a4c-11ee-97fd-c03c59ad2248";
taskService.complete(taskId); // 通过complete方法完成审批.
// 带有参数
Task task = taskService.createTaskQuery()
.processDefinitionKey("holidayRequestNew")
.taskAssignee("lisi")
.singleResult();
// 添加流程变量
Map<String,Object> variables = new HashMap<>();
variables.put("approved",false); // 拒绝请假
// 完成任务
taskService.complete(task.getId(),variables);
}
流程删除
java
RepositoryService repositoryService = processEngine.getRepositoryService();
// 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错
// repositoryService.deleteDeployment("1");
// 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删除操作。
repositoryService.deleteDeployment("2501", true);
act表和功能
Flowable 的常见表及其简要描述:
- ACT_GE_:GE 代表 General(全局),全局数据。
- ACT_RE_:RE 表示 Repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片)。
- ACT_RU_:RU 表示 Runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable 只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
- ACT_HI_:HI 表示 History。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
- ACT_ID_:ID 表示 Identity。这些表存储用户相关信息。
相关表和功能
- act_ge_bytearray: 记录流程定义的资源信息。xml和流程图的图片信息
- act_re_deployment: 流程部署表,记录这次的部署行为
- act_re_procdef: 流程定义表,记录这次部署动作对应的流程定义信息
- act_hi_actinst 流程实例执行历史
- act_hi_identitylink 流程的参与用户的历史信息
- act_hi_procinst 流程实例历史信息
- act_hi_taskinst 流程任务历史信息
- act_ru_execution 流程执行信息
- act_ru_identitylink 流程的参与用户信息
- act_ru_task 任务信息
类型 | 表名 | 说明 |
---|---|---|
General | ACT_GE_BYTEARRAY | 存储流程定义的字节码数据,包括 BPMN 文件和其他相关资源。 |
ACT_GE_PROPERTY | 存储全局属性,用于存储引擎的配置和运行时状态。 | |
Repository | ACT_RE_DEPLOYMENT | 存储流程定义的部署信息,每次部署都会生成一条记录。 |
ACT_RE_PROCDEF | 存储流程定义的元数据信息,包括流程定义的ID、名称、版本等。 | |
ACT_RE_MODEL | 存储流程模板相关描述信息。 | |
Runtime | ACT_RU_TASK | 存储任务的运行时数据,包括任务的ID、负责人、创建时间等。 |
ACT_RU_EXECUTION | 存储流程实例的运行时数据,包括当前活动节点、流程变量等。 | |
ACT_RU_IDENTITYLINK | 存储运行时流程人员信息,常用于查询人员或部门的待办任务。 | |
ACT_RU_JOB | 存储作业(Job)的数据,用于异步执行定时任务等。 | |
ACT_RU_VARIABLE | 存储流程实例和任务的变量数据。 | |
ACT_RU_EVENT_SUBSCR | 监听信息表。 | |
History | ACT_HI_ACTINST | 存储已完成的流程活动(节点)的历史数据,包括活动的类型、开始时间、结束时间等。 |
ACT_HI_PROCINST | 存储已完成的流程实例的历史数据,包括流程实例的开始时间、结束时间等。 | |
ACT_HI_TASKINST | 存储已完成的任务的历史数据,包括任务的完成时间、处理人等。 | |
ACT_HI_VARINST | 存储已完成的变量的历史数据。 | |
ACT_HI_DETAIL | 存储已完成的流程实例和任务的详细变量数据。 | |
ACT_HI_COMMENT | 存储已完成的审批意见的历史数据。 | |
ACT_HI_ATTACHMENT | 存储已完成的历史附件。 | |
ACT_HI_IDENTITYLINK | 存储已完成的参与者历史数据,包括各节点候选、办理人员信息,常用于查询某人或部门的已办任务。 | |
Identity | ACT_ID_GROUP | 存储用户组信息,包括用户组的ID、名称等。 |
ACT_ID_INFO | 存储用户扩展信息。 | |
ACT_ID_MEMBERSHIP | 存储用户与用户组之间的关联关系。 | |
ACT_ID_USER | 存储用户信息,包括用户的ID、用户名、密码等。 |