Flowable是一个开源的工作流引擎,它基于Activiti引擎进行发展,Flowable主要用于为业务流程管理(BPM)和工作流的设计、操作、监控提供支持。
这类表在Flowable中主要提供存储通用类型数据的功能,如流程名称,创建时间等。如下是通用表的主要成员:
这类表主要用于在流程运行过程中,存储实时的流程数据。如下是运行时数据表的主要成员:
这类表主要用于在流程完成后,存储历史的流程数据,如流程实例,任务,变量等。如下是历史数据表的主要成员:
这类表主要用于存储组织机构和用户权限相关的数据。如下是身份数据表的主要成员:
这类表主要用于存储流程定义相关的数据。如下是流程定义数据表的主要成员:
. 流程定义(Process Definition):流程定义是包含所有流程与审批步骤(任务节点、网关等)的XML文件,通常使用BPMN(Business Process Model and Notation) 2.0语言编写。这些文件在部署到Flowable引擎时会存储到数据库中,以便在运行时创建实例。
数据库表:Flowable使用关系型数据库来存储审批流相关的信息。其中的相关表格如下:
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<flowable.version>6.7.2flowable.version>
properties>
<dependency>
<groupId>org.flowablegroupId>
<artifactId>flowable-spring-boot-starterartifactId>
<version>${flowable.version}version>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.flowablegroupId>
<artifactId>flowable-spring-boot-starterartifactId>
<version>${flowable.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>8.0.22version>
dependency>
/**
* 启动类
*
*/
@SpringBootApplication
public class FlowableApplication
{
public static void main( String[] args )
{
System.out.println("流程系统启动.................");
SpringApplication.run(FlowableApplication.class,args);
System.out.println("流程系统启动成功.................");
}
}
启动服务会在数据库自动创建flowable的表,可能会出现下边的错误。
nested exception is org.flowable.common.engine.api.FlowableException: Could not update Flowable database schema: unknown version from database: ‘6.8.0.0’
解决方法:
修改mysql驱动的版本为8.0.22
Caused by: java.sql.SQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes atcom.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) ~[mysql-connector-java-8.0.22.jar:8.0.22] at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.22.jar:8.0.22]
项目mysql的版本5.6.51
导致上面报错的原因是由于InnoDB表的索引长度限制,在MySQL5.6版本后引入了参数innodb_large_prefix可以解决这个问题。该参数控制是否允许单列的索引长度超过767字节,有ON和OFF两个取值:
ON :Innodb表的行记录格式是Dynamic或Compressed的前提下,单列索引长度上限扩展到3072个字节
OFF:Innodb表的单例索引长度最多为767个字节,索引长度超出后,主键索引会创建失败,辅助索引会被截断成为前缀索引。
进行如下设置,重启mysql:
set global innodb_large_prefix = ON;
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=ON;
文件的后缀名字 demo.bpmn20.xml
demo.bpmn20.xml
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="DemoProcess" name="DemoProcess">
<startEvent id="start"/>
<sequenceFlow id="flow1" sourceRef="start" targetRef="userTask"/>
<userTask id="userTask" name="User Task" flowable:assignee="${creator}"/>
<sequenceFlow id="flow2" sourceRef="userTask" targetRef="end"/>
<endEvent id="end"/>
process>
definitions>
/**
* 流程部署
*/
@Component
public class ProcessDeployer {
@Autowired
private RepositoryService repositoryService;
@PostConstruct
public void init() {
repositoryService.createDeployment()
.addClasspathResource("demo.bpmn20.xml")
.deploy();
}
}
启动完成之后数据库表存储流程定义:=>ACT_RE_PROCDEF
存储部署表
//查询指定流程所有启动的实例列表
@Autowired
private RuntimeService runtimeService;
/**
* 启动
* @param creator
*/
public void startProcess(String creator) {
Map<String, Object> variables = new HashMap<>();
variables.put("creator", creator);
runtimeService.startProcessInstanceByKey("demoProcess", variables);
}
根据用户获取用户任务以及审批流
@Autowired
TaskService taskService;
//获取用户ID获取的任务列表
public List<Task> getTasksAssignedToUser(String userId) {
TaskQuery taskQuery = taskService.createTaskQuery().taskAssignee(userId);
return taskQuery.list();
}
//用户处理流程列表
public void completeTask(String taskId, boolean approved) {
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
if (task != null) {
Map<String, Object> variables = new HashMap<>();
variables.put("approved", approved);
taskService.complete(taskId, variables);
}
}