专栏名称: 终码一生
提供免费JB账号,激活码,破解工具下载;分享Java开发技术(JVM,多线程,高并发,性能调优),开源项目,常见开发问题和前沿科技资讯等!
目录
相关文章推荐
人民日报评论  ·  您的“大家谈”来稿见报啦! ·  4 小时前  
温静聚焦  ·  主编温静丨今天发生了什么? ·  2 天前  
51好读  ›  专栏  ›  终码一生

SpringBoot极简审批流:1行代码搞定请假系统,摸鱼时间翻倍

终码一生  · 公众号  ·  · 2025-05-16 10:00

正文

请到「今天看啥」查看全文


;通过流程实例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 介绍

image.png
  • ProcessEngine: 表示Activiti工作流引擎的入口,用于获取各种管理API操作的对象。

  • RepositoryService:







请到「今天看啥」查看全文