flowable笔记 流程引擎基本用法

2022-07-20 13:37:42 浏览数 (1)

版本

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();

0 人点赞