基础表结构
- Flowable的所有数据库表都是从ACT_开始的。第二部分是两个字符标记符来解释表的用途。
ACT_RE_
: 'RE代表repository。前缀表包含“静态”信息,如流程定义和流程资源(图片、规则等)。ACT_RU_
: 'RU代表runtime。这些表存储运行时的信息,如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等等。Flowable只在流程实例运行中保存运行数据,并在流程实例结束时删除记录。确保运行时间表小而快。ACT_HI_
: 'HI代表history。这些表存储历史数据,如已完成的流程实例、变量、任务等。ACT_GE_
: 通用数据。多处使用。
- act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图等字节流文件;
- act_ge_property:属性数据表(不常用);
- act_hi_actinst:各节点信息(包括开始、结束等非任务节点)的历史节点表、存储过程实例运行;
- act_hi_attachment:存储历史节点上传的附件信息(不常用);
- act_hi_comment:历史意见表;
- act_hi_detail:历史细节表,存储节点运行的一些信息(不常用);
- act_hi_identitylink:历史流程人员表,存储流程各节点的候选人和处理人员信息,常用于查询某人或部门已完成的任务;
- act_hi_procinst:历史流程实例表、存储流程实例历史数据(包括正在运行的流程实例);
- act_hi_taskinst:存储历史任务节点的历史流程任务表;
- act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
- act_id_group:用户组信息表,选择相应节点的候选组信息;
- act_id_info:用户扩展信息表,存储用户扩展信息;
- act_id_membership:用户与用户组的关系表;
- act_id_user:选择相应节点的用户信息表或候选人信息;
- act_re_deployment:存储过程定义、模板部署信息的部属信息表;
- act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真实内容存储在act_ge_bytearay表以字节形式存储;
- act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真实内容存储在act_ge_bytearay表以字节形式存储;
- act_ru_task:操作过程中的任务节点表,存储操作过程中的任务节点信息,常用于查询人员或部门的待办任务;
- act_ru_event_subscr:监控信息表,不常用;
- act_ru_execution:运行过程执行实例表,记录运行过程中运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据一一对应);
- act_ru_identitylink:操作过程人员表,重要,常用于查询人员或部门的待办任务;
- act_ru_job:操作时定时任务数据表,存储过程中定时任务信息;
- act_ru_variable:操作过程中的流程变量数据表,存储操作过程中各节点的变量信息;
Service是工作流引擎为工作流部署、执行和管理提供的服务接口。我们使用这些接口可以是操作服务对应的数据表
Service创建方法Servicececesengine通过Procesengine创建
RuntimeService runtimeService = processEngine.getRuntimeService();RepositoryService repositoryService = processEngine.getRepositoryService();TaskService taskService = processEngine.getTaskService();// ...
Service总结service名称
service功能
RepositoryService
Flowable资源管理类
RuntimeService
Flowable的流程运行管理
TaskService
Flowable任务管理类
HistoryService
Flowable的历史管理
ManagerService
Flowable引擎管理类
RepositoryService
它是activiti的资源管理类别,提供了管理和控制流程发布包和流程定义的操作。使用工作流建模工具设计的业务流程图需要将流程定义文件的内容部署到计算机中。
除了部署流程定义外,还可以查询引擎中的发布包和流程定义。
对应全部和具体流程的定义,暂停或激活发布包。 暂停意味着它们不能再执行任何操作,激活是相应的反向操作。获取包含在发布包中的文件等多种资源, 或由引擎自动生成的流程图。
pojo版本获得流程定义, 无需xml,可用于java分析过程。
RuntimeService
Activiti的流程运行管理。您可以从这个服务类别中获得大量关于流程执行的信息
TaskService
Activiti的任务管理类别。任务信息可以从这个类别中获得。
HistoryService
Flowable的历史管理可以查询历史信息。在执行过程时,引擎将保存大量数据(根据配置),如流程实例启动时间和任务参与者, 完成任务的时间、每个流程实例的执行路径等。 该服务主要通过查询功能获取这些数据。
ManagementService
Activiti的引擎管理提供了Flowable 工作流驱动的应用程序中不使用流程引擎的管理和维护功能,主要用于 Flowable 日常维护系统。
实战package com.bobo.flowable.test;import org.flowable.engine.*;import org.flowable.engine.history.HistoricActivityInstance;import org.flowable.engine.history.HistoricActivityInstanceQuery;import org.flowable.engine.impl.cfg.StandaloneProcessEngineConfiguration;import org.flowable.engine.repository.Deployment;import org.flowable.engine.repository.DeploymentBuilder;import org.flowable.engine.repository.ProcessDefinition;import org.flowable.engine.repository.ProcessDefinitionQuery;import org.flowable.engine.runtime.ProcessInstance;import org.flowable.task.api.Task;import org.junit.Before;import org.junit.Test;import java.util.HashMap;import java.util.List;import java.util.Map;public class Test01 { /** * 获取流程引擎对象 */ @Test public void testProcessEngine() { // 获取 ProcessEngineConfiguration 对象 ProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration(); // 配置 相关数据库的连接信息 configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver"); configuration.setJdbcUsername("root"); configuration.setJdbcPassword("123456"); configuration.setJdbcUrl("jdbc:mysql://localhost:3306/flowable-learn?serverTimezone=UTC&nullCatalogMeansCurrent=true"); // 如果数据库中的表结构不存在,则新建 configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // 通过 ProcessEngineConfiguration 构建我们需要的东西 processEngine 对象 ProcessEngine processEngine = configuration.buildProcessEngine(); System.out.println("processEngine = " + processEngine); } ProcessEngineConfiguration configuration = null; @Before public void before() { // 获取 ProcessEngineConfiguration 对象 configuration = new StandaloneProcessEngineConfiguration(); // 配置 相关数据库的连接信息 configuration.setJdbcDriver("com.mysql.cj.jdbc.Driver"); configuration.setJdbcUsername("root"); configuration.setJdbcPassword("123456"); configuration.setJdbcUrl("jdbc:mysql://localhost:3306/flowable-learn?serverTimezone=UTC&nullCatalogMeansCurrent=true"); // 如果数据库中的表结构不存在,则新建 configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); } /** * 部署流程 */ @Test public void testDeploy() { // 1.获取 ProcessEngine 对象 ProcessEngine processEngine = configuration.buildProcessEngine(); // 2.获得RepositoryServicecee RepositoryService repositoryService = processEngine.getRepositoryService(); // 3.完成流程的部署操作 Deployment deploy = repositoryService.createDeployment() .addClasspathResource("holiday-request.bpmn20.xml")// 关联要部署的流程文件 .name(“请求流程”) .deploy();// 部署流程 System.out.println("deploy.getId() = " + deploy.getId()); System.out.println("deploy.getName() = " + deploy.getName()); } /** * 查询流程定义的信息 */ @Test public void testDeployQuery() { ProcessEngine processEngine = configuration.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); /*ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); ProcessDefinition processDefinition = processDefinitionQuery.deploymentId("1").singleResult();*/ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .deploymentId("1") .singleResult(); System.out.println("processDefinition.getDeploymentId() = " + processDefinition.getDeploymentId()); System.out.println("processDefinition.getName() = " + processDefinition.getName()); System.out.println("processDefinition.getDescription() = " + processDefinition.getDescription()); System.out.println("processDefinition.getId() = " + processDefinition.getId()); } /** * 删除流程定义 */ @Test public void testDeleteDeploy() { ProcessEngine processEngine = configuration.buildProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); // 删除部署过程 第一个参数是 id 如果部署过程启动,则不允许删除/// repositoryService.deleteDeployment("2501"); // 第二个参数是级联删除,若流程启动 删除相关任务 repositoryService.deleteDeployment("1", true); } /** * 启动过程实例 */ @Test public void testRunProcess() { ProcessEngine processEngine = configuration.buildProcessEngine(); // 我们需要通过RuntimeService来启动过程实例 RuntimeService runtimeService = processEngine.getRuntimeService(); // 施工过程变量 Map<String, Object> variables = new HashMap<>(); variables.put("employee", "张三"); variables.put("nrOfHolidays", 3); variables.put("desciption", 工作累了,出去玩”); // 启动过程实例 holidayRequest是流程文件(bpmn)id ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("holidayRequest", variables); System.out.println("holidayRequest.getProcessDefinitionId() = " + holidayRequest.getProcessDefinitionId()); System.out.println("holidayRequest.getActivityId() = " + holidayRequest.getActivityId()); System.out.println("holidayRequest.getId() = " + holidayRequest.getId()); } /** * 查询测试任务 */ @Test public void testQueryTask() { ProcessEngine processEngine = configuration.buildProcessEngine(); TaskService taskService = processEngine.getTaskService(); List<Task> list = taskService.createTaskQuery() .processDefinitionKey("holidayRequest") // 流程编程指定查询 .taskAssignee("zhangsan") // 查询此任务的处理人 .list(); for (Task task : list) { System.out.println("task.getProcessDefinitionId() = " + task.getProcessDefinitionId()); System.out.println("task.getName() = " + task.getName()); System.out.println("task.getAssignee() = " + task.getAssignee()); System.out.println("task.getDescription() = " + task.getDescription()); System.out.println("task.getId() = " + task.getId()); } } /** * 完成当前任务 */ @Test public void testCompleteTask() { ProcessEngine processEngine = configuration.buildProcessEngine(); TaskService taskService = processEngine.getTaskService(); Task task = taskService.createTaskQuery() .processDefinitionKey("holidayRequest") .taskAssignee("zhangsan") .singleResult(); // 创建流程变量 Map<String, Object> map = new HashMap<>(); map.put("approved", false); // 完成任务 taskService.complete(task.getId(), map); } /** * 获取流程任务的历史数据 */ @Test public void testHistory() { ProcessEngine processEngine = configuration.buildProcessEngine(); HistoryService historyService = processEngine.getHistoryService(); List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery() .processDefinitionId("holidayRequest:1:5003") .finished() // 查询的历史记录状态已经完成 .orderByHistoricActivityInstanceEndTime().asc() // 指定排序的字段和顺序 .list(); for (HistoricActivityInstance history : list) { System.out.println(history.getActivityName() + ":" + history.getAssignee() + "--" + history.getActivityId() + ":" + history.getDurationInMillis() + "毫秒"); } }}