正文
;通过流程实例id,拿到流程执行的所有节点。执行记录如下图,可完整看到流程执行的完整过程。
List activityInstanceList =
historyService.createHistoricActivityInstanceQuery().processInstanceId(instance.getId()).list();
for (HistoricActivityInstance historicActivityInstance : activityInstanceList) {
log.warn("activityName:{},activityType:{}, assignee:{}, taskId:{}",
historicActivityInstance.getActivityName(),
historicActivityInstance.getActivityType(),
historicActivityInstance.getAssignee(),
historicActivityInstance.getTaskId());
activiti 项目基础配置
首先引入activiti pom
<dependency>
<groupId>org.activitigroupId>
<artifactId>activiti-spring-boot-starter-basicartifactId>
<version>5.23.0version>
dependency>
我使用的是activiti 5.x,配套的
Springboot starter parent
是
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.4version>
<relativePath/>
parent>
配置数据源和工作流引擎配置类
activiti 需要使用方提供数据库配置,在项目启动时,activiti 会自动检查数据库是否包含activiti 相关的表,如果不包含,会自动帮你建表。
在学习activiti 的过程中,我没有安装MySQL,而是使用H2 内存数据库,该数据库在Java进程中,随JVM同生共死,无需担心重复启动,数据被污染等问题,非常适合学习activiti 的时候使用
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource">
<propertyname="driverClassName"value="org.h2.Driver"/>
<propertyname="url"value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;mode=MySQL;"/>
bean>
<beanid="processEngineConfiguration"class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<propertyname="dataSource"ref="dataSource"/>
<propertyname="databaseSchemaUpdate"value="true"/>
bean>
<context:component-scanbase-package="com.muppet.activiti"/>
beans>
H2 需要的POM如下
<dependency>
<groupId>com.h2databasegroupId>
<artifactId>h2artifactId>
<scope>runtimescope>
dependency>
全部示例代码
@SpringBootTest(classes = {ActivitiStartApplication.class})
classActivitiStartApplicationTests{
publicstaticfinal Logger log = LoggerFactory.getLogger(ActivitiStartApplicationTests.class);
@Autowired
private ApplyTaskListener applyTaskListener;
@Test
voidcontextLoads(){
System.out.println("启动成功");
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = engine.getRepositoryService();
RuntimeService runtimeService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
HistoryService historyService = engine.getHistoryService();
repositoryService.createDeployment().addClasspathResource("processes/apply.bpmn").deploy();
Map variableMap = new HashMap<>();
variableMap.put("applyUser", "zhang3");
variableMap.put("supervisor", "li4");
variableMap.put("upperSupervisor", "wang5");
ProcessInstance instance = runtimeService.startProcessInstanceByKey("apply_processor_1", variableMap);
Task firstTask = taskService.createTaskQuery().taskAssignee("zhang3").singleResult();
log.warn("用户任务完成,流程ID:{}, 任务名称 :{}, id:{}, assignee:{}", firstTask.getProcessInstanceId(), firstTask.getName(), firstTask.getId(), firstTask.getAssignee());
taskService.complete(firstTask.getId(), Maps.newHashMap("day", 4));
Task secondTask = taskService.createTaskQuery().taskAssignee("li4").singleResult();
taskService.setVariable(secondTask.getId(), "result1", true);
log.warn("用户任务完成流程ID:{}, 任务名称 :{}, id:{}, assignee:{}", secondTask.getProcessInstanceId(), secondTask.getName(), secondTask.getId(), secondTask.getAssignee());
taskService.complete(secondTask.getId());
Task thirdTask = taskService.createTaskQuery().taskAssignee("wang5").singleResult();
if (thirdTask != null) {
taskService.setVariable(thirdTask.getId(), "result2", true);
log.warn("用户任务完成,流程ID:{}, 任务名称:{}, id:{}, assignee:{}", thirdTask.getProcessInstanceId(), thirdTask.getName(), thirdTask.getId(), thirdTask.getAssignee(), thirdTask.getDelegationState());
taskService.complete(thirdTask.getId());
} else {
log.warn("没有查到二级主管审批任务");
}
log.warn("流程执行过程如下");
List activityInstanceList = historyService.createHistoricActivityInstanceQuery().processInstanceId(instance.getId()).list();
for (HistoricActivityInstance historicActivityInstance : activityInstanceList) {
log.warn("activityName:{},activityType:{}, assignee:{}, taskId:{}",
historicActivityInstance.getActivityName(),
historicActivityInstance.getActivityType(),
historicActivityInstance.getAssignee(),
historicActivityInstance.getTaskId());
}
}
}
activiti 工作流引擎数据库设计
为了保证流程的可靠性和可恢复性,工作流引擎通常会将流程实例的状态和数据持久化存储到中。在流程执行过程中,引擎会不断地更新数据库中的状态数据。activiti 共包含了一系列用于存储流程定义、运行时数据以及历史记录的表。
1. 流程定义相关表
ACT_RE_*
系列表:主要包括流程定义(
Process Definitions
)、流程资源(
Resources
)和其他静态信息的存储。
2. 运行时数据表
ACT_RU_*
系列表:这些表存放了流程实例执行过程中的实时数据,如任务(Tasks)、流程实例(Process Instances)、变量(Variables)、执行对象(Executions)等。
3. 历史数据表
ACT_HI_*
系列表:当流程实例结束或达到特定条件时,相关的运行时数据会被迁移到历史表中,以供后期审计、报告分析之用。
4. 身份和权限表
ACT_ID_*
系列表:主要用于存储用户、组以及相关的身份和权限信息。
5. 其他辅助表
包括事件日志表:(Event Log)、作业及定时器表(Job and Timer entities)等,它们服务于调度、异步处理等功能需求。
工作流引擎API 介绍
-
ProcessEngine:
表示Activiti工作流引擎的入口,用于获取各种管理API操作的对象。
-