版本
flowable 6.7.2 mysql
依赖
代码语言:javascript复制<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<version>6.7.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.29</version>
</dependency>
创建引擎
代码语言:javascript复制ProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration();
// 配置数据库的连接信息
configuration.setJdbcDriver(com.mysql.cj.jdbc.Driver.class.getName());
configuration.setJdbcUsername("user");
configuration.setJdbcPassword("password");
// 注,没有nullCatalogMeansCurrent=true参数初始化数据库可能失败
configuration.setJdbcUrl("jdbc:mysql://localhost:3306/flowable_test?nullCatalogMeansCurrent=true");
// 如果数据库没有初始化,则初始化表结构
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
// 构建引擎
this.engine = configuration.buildProcessEngine();
部署流程
代码语言:javascript复制this.engine.getRepositoryService()
.createDeployment()
.addClasspathResource("请假流程.bpmn20.xml")
.name("请假流程")
.deploy();
涉及的表操作:
- act_re_deployment 部署记录
- act_re_procdef 流程定义记录,与部署记录时多对一关系,一次部署可以包含多个流程
- act_ge_bytearray 保存部署中包含的资源文件(图片,流程设计图)
查询已部署的流程
代码语言:javascript复制// 查询流程定义信息
ProcessDefinition processDefinition = this.engine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey("holidayRequest") // 请假流程.bpmn20.xml文件中process节点的id属性
.singleResult();
// 查询部署信息
Deployment deployment = this.engine.getRepositoryService()
.createDeploymentQuery()
.processDefinitionKey("holidayRequest")
.singleResult();
删除已部署的流程
代码语言:javascript复制// 如果部署的流程已经启动,则报错
// this.engine.getRepositoryService().deleteDeployment(deployment.getId(),);
// 级联删除,流程启动了,则将相关任务一并删除
this.engine.getRepositoryService().deleteDeployment(deployment.getId(), true);
挂起/激活流程
代码语言:javascript复制if (processDefinition.isSuspended()) {
// 激活流程
this.engine.getRepositoryService().activateProcessDefinitionByKey(processDefinition.getKey());
} else {
// 挂起流程
this.engine.getRepositoryService().suspendProcessDefinitionByKey(processDefinition.getKey());
}
涉及的表操作:
- act_re_procdef字段*SUSPENSION_STATE_*值
启动流程实例
代码语言:javascript复制Map<String, Object> variable = new HashMap<>();
variable.put("employee", "张三");
variable.put("nrOfHolidays", 3);
variable.put("description", "出去玩玩");
ProcessInstance processInstance = this.engine.getRuntimeService()
.startProcessInstanceByKey("holidayRequest", variable); // 流程模型中的ID,传入变量(表单数据)
涉及的表操作:
- act_ru_execution 执行实例(每个实例有两条记录)
- act_ru_identitylink 关联的用户(支持的类型在IdentityLinkType中定义,assignee:处理人,candidate:候选人,owner:所有者,starter:发起人,participant:参与者(默认))
- act_ru_task 当前任务
- act_ru_variable 变量表
查询当前任务
代码语言:javascript复制// 根据流程和处理人查询当前待办任务
List<Task> tasks = this.engine.getTaskService()
.createTaskQuery()
.processDefinitionKey("holidayRequest")
.taskAssignee("张三")
.list();
完成任务
代码语言:javascript复制Map<String, Object> variables = new HashMap<>();
variables.put("approved", new Random().nextBoolean());
this.engine.getTaskService()
.complete(task.getId(), variables); // 设置流程节点所需的变量(例如审批节点后,网关分支流条件表达式参数)
查询历史任务
代码语言:javascript复制List<HistoricActivityInstance> histories = engine.getHistoryService()
.createHistoricActivityInstanceQuery()
.processDefinitionId(processDefinition.getId())
.finished() // 查询状态为已完成的记录
.orderByHistoricActivityInstanceEndTime().asc() // 指定排序字段和顺序
.list();