SpringBoot3整合Activiti7做流程管理系统(一)

手把手教你用Spring Boot 3集成Activiti 7:一个云原生流程引擎的‘Hello World’ 本文详细介绍了如何在Spring Boot 3环境中集成Activiti 7流程引擎,通过一个完整的请假流程示例展示其云原生特性。从环境准备、项目初始化到与Kubernetes的深度集成,帮助开发者快速掌握新一代流程引擎的应用实践,特别适合需要高并发、高可用业务场景的企业。 阅读详情
AI摘要

本文介绍SpringBoot3整合Activiti7做流程管理系统。先阐述Activiti使用的各类数据表用途,如全局通用、历史数据等表。接着讲解快速入门内容,包括流程部署的自动与手动方式、自定义流程创建、单元测试等。还提及流程定义、实例、任务管理、历史记录、UEL表达式及BPMN2.0网关等知识。

pom.xml

<dependencies>
        <!-- 引入bootstrap依赖,不引入这个依赖是无法使用bootstrap配置文件的 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>${activiti.version}</version>
            <exclusions>
                <exclusion><!-- 排除activiti的mybatis,避免和外面的mybatis-plus冲突 -->
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.activiti.dependencies</groupId>
            <artifactId>activiti-dependencies</artifactId>
            <version>${activiti.version}</version>
            <type>pom</type>
        </dependency>
        <!-- 如果需要使用 Activiti 模型器,还需添加 modeler 依赖 -->
        <!--<dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-modeler</artifactId>
            <version>${activiti.version}</version>
        </dependency>-->
        <!--activiti可以绘制生成流程的的依赖-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-image-generator</artifactId>
            <version>${activiti.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-lang3</artifactId>
                    <groupId>org.apache.commons</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>commons-io</artifactId>
                    <groupId>commons-io</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 数据库相关依赖 -->
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <optional>true</optional>
        </dependency>
        <!-- hutool -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool-all.version}</version>
        </dependency>
        <!-- guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>${guava.version}</version>
        </dependency>
        <!-- 新版jdk11以上已经没有@Resuorce注解 需要导入 -->
        <!--<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>-->
        <!-- fastjson2 -->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>${fastjson2.version}</version>
        </dependency>
    </dependencies>

Activiti 使用到的表都是 ACT_ 开头的,表名的第二部分表示用途。

  • ACT_GE_ (GE) 表示 general 全局通用数据及设置,各种情况都使用的数据。

  • ACT_HI_ (HI) 表示 history 历史数据表,包含着程执行的历史相关数据。

  • ACT_RE_ (RE) 表示 repository 存储,包含的是静态信息。

  • ACT_RU_ (RU) 表示 runtime 运行时,运行时的流程变量,用户任务,变量,职责(job)等运行时数据。Activiti 只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录

全局通用数据(ACT_GE_*)#
表名解释
ACT_GE_BYTEARRAY二进制数据表,存储通用的流程定义和流程资源。
ACT_GE_PROPERTY系统相关属性,属性数据表存储整个流程引擎级别的数据。

历史数据表(ACT_HI_*)#

表名解释
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_RE_*)#
表名解释
ACT_RE_DEPLOYMENT部署信息表
ACT_RE_MODEL流程设计模型部署表
ACT_RE_PROCDEF流程定义数据表
运行数据(ACT_RU_*)#
表名解释
ACT_RU_DEADLETTER_JOB无法执行工作表: 如果一个任务执行了很多次,都无法执行,那么这个任务会写到
ACT_RU_EVENT_SUBSCR运行时事件 throwEvent、catchEvent 时间监听信息表
ACT_RU_EXECUTION运行时流程执行实例
ACT_RU_IDENTITYLINK运行时流程人员表,主要存储任务节点与参与者的相关信息
ACT_RU_INTEGRATION运行时积分表
ACT_RU_JOB运行时定时任务数据表
ACT_RU_SUSPENDED_JOB暂停的工作,流程中有一个定时任务,如果把这个任务停止工作了,这个任务会在act_ru_suspended_job中写入数据
ACT_RU_TASK运行时任务节点表
ACT_RU_TIMER_JOB运行时定时器作业表
ACT_RU_VARIABLE运行时流程变量数据表
其它表#
表名解释
ACT_EVT_LOG事件日志
ACT_PROCDEF_INFO流程定义的动态变更信息

快速入门#

流程部署#

流程部署方式分为两种:自动部署与手动部署

自动部署:将 bpmn 文件放入 resources 资源目录下的 processes 文件夹中,项目启动时则进行自动部署。

spring:
  # activiti7配置
  activiti:
    # 自动部署验证设置:true-开启(默认)、false-关闭
    check-process-definitions: true
    # 保存历史数据
    history-level: full
    # 检测历史表是否存在
    db-history-used: true
    # 关闭SpringAutoDeployment
    deployment-mode: never-fail
    # 对数据库中所有表进行更新操作,如果表不存在,则自动创建
    database-schema-update: true
    # 解决频繁查询SQL问题
    async-executor-activate: false

手动部署:新建测试类,并编写流程部署测试方法。

自定流程#
  1. 创建 *.bpmn20.xml 文件:New -> New Activity 6.x BPMN 2.x file
  2. 流程设计页面:选中 *.bpmn20.xml 文件,右键 view BPMN(Activity ) Diagram
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/processdef">
  <process id="Part1_Deployment" name="Part1_Deployment" isExecutable="true">
    <startEvent id="sid-26d6e725-878e-411d-b23d-6df4ae3cbd24"/>
    <endEvent id="sid-03d64ced-963c-4506-a5b3-21b8a9dc4279"/>
    <userTask id="sid-192966db-031d-4a50-886d-379935dd9bc1" name="UserTask" activiti:assignee="admin"/>
    <sequenceFlow id="sid-560ce1e7-a0f9-4a99-8a64-d2920292cd37" sourceRef="sid-26d6e725-878e-411d-b23d-6df4ae3cbd24" targetRef="sid-192966db-031d-4a50-886d-379935dd9bc1"/>
    <sequenceFlow id="sid-da2d1cc1-7544-40f6-81ab-1d0c32c0064a" sourceRef="sid-192966db-031d-4a50-886d-379935dd9bc1" targetRef="sid-03d64ced-963c-4506-a5b3-21b8a9dc4279"/>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_Part1_Deployment">
    <bpmndi:BPMNPlane bpmnElement="Part1_Deployment" id="BPMNPlane_Part1_Deployment">
      <bpmndi:BPMNShape id="shape-6b3bc939-03fe-47d7-b1fb-44a959045633" bpmnElement="sid-26d6e725-878e-411d-b23d-6df4ae3cbd24">
        <omgdc:Bounds x="-20.0" y="-85.0" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-8137d303-1a5b-4a34-b8d7-995a29ae534a" bpmnElement="sid-03d64ced-963c-4506-a5b3-21b8a9dc4279">
        <omgdc:Bounds x="-20.0" y="105.00001" width="30.0" height="30.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="shape-40199472-3308-4677-9a38-067b57a4a17b" bpmnElement="sid-192966db-031d-4a50-886d-379935dd9bc1">
        <omgdc:Bounds x="-55.0" y="-15.0" width="100.0" height="80.0"/>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="edge-05926a76-90de-4b3f-8fd5-d27d06dd6d6e" bpmnElement="sid-560ce1e7-a0f9-4a99-8a64-d2920292cd37">
        <omgdi:waypoint x="-5.0" y="-55.0"/>
        <omgdi:waypoint x="-5.0" y="-15.0"/>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="edge-6b52ec5d-0f90-4972-a304-022f03ccf3cf" bpmnElement="sid-da2d1cc1-7544-40f6-81ab-1d0c32c0064a">
        <omgdi:waypoint x="-5.0" y="65.0"/>
        <omgdi:waypoint x="-5.0" y="105.00001"/>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

单元测试#
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipInputStream;

@SpringBootTest
public class DeploymentTest {

    @Autowired
    private RepositoryService repositoryService;

    /**
     * 流程部署
     */
    @Test
    public void initDeployment() {
        String fileName = "bpmn/Part1_Deployment.bpmn20.xml";
        Deployment deployment = this.repositoryService.createDeployment()
                .addClasspathResource(fileName)
                .name("流程部署测试")
                .deploy();
        System.out.println("流程部署名称:" + deployment.getName());
    }

    /**
     * 流程部署(Zip包)
     */
    @Test
    public void initDeploymentByZip() {
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream("bpmn/Part1_Deployment.zip");
        assert inputStream != null;
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        Deployment deployment = this.repositoryService.createDeployment()
                .addZipInputStream(zipInputStream)
                .name("流程部署测试(Zip包)")
                .deploy();
        System.out.println("流部署名称:" + deployment.getName());
    }

    /**
     * 查询流程部署列表
     */
    @Test
    public void listDeployments() {
        List<Deployment> deployments = this.repositoryService.createDeploymentQuery().list();
        if (!deployments.isEmpty()) {
            deployments.forEach(deployment -> {
                System.out.println("Id:" + deployment.getId());
                System.out.println("Name:" + deployment.getName());
                System.out.println("DeploymentTime:" + deployment.getDeploymentTime());
                System.out.println("Key:" + deployment.getKey());
            });
        }
    }

    /**
     * 删除对流程实例、历史流程实例和作业的给定部署和级联删除
     */
    @Test
    public void deleteDeployment() {
        String deploymentId = "4c97f9ce-4774-11ed-930a-e4a8dfd43d4a";
        this.repositoryService.deleteDeployment(deploymentId, false);
    }
}

涉及数据表:act_re_deployment、act_re_procdef、act_ge_bytearray

act_re_deployment 和 act_re_procdef 属于一对多关系,即:一次部署可以部署多个流程定义,而只会在 act_re_deployment 生成一条记录

流程定义#
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;

import java.util.List;

@SpringBootTest
public class ProcessDefinitionTest {

    @Autowired
    private RepositoryService repositoryService;

    /**
     * 查询流程定义列表
     */
    @Test
    public void listProcessDefinitions() {
        List<ProcessDefinition> processDefinitions = this.repositoryService.createProcessDefinitionQuery()
                .list();
        if (!CollectionUtils.isEmpty(processDefinitions)) {
            processDefinitions.forEach(processDefinition -> {
                System.out.println("Name:" + processDefinition.getName());
                System.out.println("Key:" + processDefinition.getKey());
                System.out.println("ResourceName:" + processDefinition.getResourceName());
                System.out.println("DeploymentId:" + processDefinition.getDeploymentId());
                System.out.println("Version:" + processDefinition.getVersion());
            });
        }
    }
}
流程实例#

注意:流程定义(ProcessDefinition)与流程实例(ProcessInstance)是一对多关系

import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
public class ProcessInstanceTest {

    @Autowired
    private RuntimeService runtimeService;

    /**
     * 初始化流程实例
     */
    @Test
    public void initProcessInstance() {
        // 流程定义KEY
        String processDefinitionKey = "Part1_Deployment";
        // 业务表KEY(用于把业务数据与Activiti7流程数据相关联)
        String businessKey = "4208169753200945";
        // 参数
        Map<String, Object> variables = new HashMap<>(16);
        ProcessInstance processInstance = this.runtimeService
                .startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
        System.out.println("流程实例ID:" + processInstance.getProcessInstanceId());
    }

    /**
     * 查询流程实例
     */
    @Test
    public void getProcessInstance() {
        String processInstanceId = "354709ac-477f-11ed-abfa-e4a8dfd43d4a";
        ProcessInstance processInstance = this.runtimeService.createProcessInstanceQuery()
                .processInstanceId(processInstanceId)
                .singleResult();
        System.out.println("ProcessInstanceId:" + processInstance.getProcessInstanceId());
        System.out.println("ProcessDefinitionId:" + processInstance.getProcessDefinitionId());
        System.out.println("isEnded:" + processInstance.isEnded());
        System.out.println("isSuspended:" + processInstance.isSuspended());
    }

    /**
     * 查询流程实例列表
     */
    @Test
    public void listProcessInstances() {
        List<ProcessInstance> processInstanceList = this.runtimeService.createProcessInstanceQuery().list();
        if (!CollectionUtils.isEmpty(processInstanceList)) {
            processInstanceList.forEach(processInstance -> {
                System.out.println("ProcessInstanceId:" + processInstance.getProcessInstanceId());
                System.out.println("ProcessDefinitionId:" + processInstance.getProcessDefinitionId());
                System.out.println("isEnded:" + processInstance.isEnded());
                System.out.println("isSuspended:" + processInstance.isSuspended());
            });
        }
    }

    /**
     * 挂起流程实例
     */
    @Test
    public void suspendProcessInstance() {
        String processInstanceId = "354709ac-477f-11ed-abfa-e4a8dfd43d4a";
        this.runtimeService.suspendProcessInstanceById(processInstanceId);
    }

    /**
     * 激活流程实例
     */
    @Test
    public void activeProcessInstance() {
        String processInstanceId = "354709ac-477f-11ed-abfa-e4a8dfd43d4a";
        this.runtimeService.activateProcessInstanceById(processInstanceId);
    }

    /**
     * 删除流程实例
     */
    @Test
    public void deleteProcessInstance() {
        String processInstanceId = "354709ac-477f-11ed-abfa-e4a8dfd43d4a";
        String reason = "测试删除流程实例";
        this.runtimeService.deleteProcessInstance(processInstanceId, reason);
    }
}

涉及数据表:act_hi_actinst、act_hi_taskinst、act_hi_identitylink、act_hi_procinst、act_ru_execution、act_ru_identitylink、act_ru_task

任务管理#

  • Assignee:执行人/代理人
  • Candidate Users:候选人
  • Candidate Groups:候选组
  • Due Date:任务到期时间
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@SpringBootTest
public class TaskTest {

    @Autowired
    private TaskService taskService;

    /**
     * 查询任务列表
     */
    @Test
    public void listTasks() {
        List<Task> taskList = this.taskService.createTaskQuery().list();
        if (!CollectionUtils.isEmpty(taskList)) {
            taskList.forEach(task -> {
                System.out.println("Id:" + task.getId());
                System.out.println("Name:" + task.getName());
                System.out.println("Assignee:" + task.getAssignee());
            });
        }
    }

    /**
     * 查询我的代办任务
     */
    @Test
    public void listTasksByAssignee() {
        String assignee = "admin";
        List<Task> taskList = this.taskService.createTaskQuery()
                .taskAssignee(assignee)
                .list();
        if (!CollectionUtils.isEmpty(taskList)) {
            taskList.forEach(task -> {
                System.out.println("Id:" + task.getId());
                System.out.println("Name:" + task.getName());
                System.out.println("Assignee:" + task.getAssignee());
            });
        }
    }

    /**
     * 完成任务
     */
    @Test
    public void completeTask() {
        String taskId = "354b9d90-477f-11ed-abfa-e4a8dfd43d4a";
        Map<String, Object> variables = new HashMap<>(16);
        this.taskService.complete(taskId, variables);
    }

    /**
     * 拾取任务
     */
    @Test
    public void claimTask() {
        String taskId = "16beabc1-479f-11ed-9c3a-e4a8dfd43d4a";
        String userId = "jason";
        Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
        taskService.claim(taskId, userId);
    }

    /**
     * 归还任务
     */
    @Test
    public void returnTask() {
        String taskId = "16beabc1-479f-11ed-9c3a-e4a8dfd43d4a";
        Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
        // 归还任务
        taskService.unclaim(taskId);
    }

    /**
     * 交办任务
     */
    @Test
    public void handoverTask() {
        String taskId = "16beabc1-479f-11ed-9c3a-e4a8dfd43d4a";
        String userId = "jack";
        Task task = this.taskService.createTaskQuery().taskId(taskId).singleResult();
        // 交办任务
        taskService.setAssignee(taskId, userId);
    }
}

涉及数据表:act_hi_actinst、act_hi_taskinst、act_hi_identitylink、act_hi_procinst、act_ru_execution、act_ru_identitylink、act_ru_task

历史记录#
import org.activiti.engine.HistoryService;
import org.activiti.engine.history.HistoricTaskInstance;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.CollectionUtils;

import java.util.List;

@SpringBootTest
public class HistoricTest {

    @Autowired
    private HistoryService historyService;

    /**
     * 根据用户名查询历史记录
     */
    @Test
    public void listHistoricTasksByAssignee() {
        String assignee = "admin";
        List<HistoricTaskInstance> historicTasks = this.historyService.createHistoricTaskInstanceQuery()
                .orderByHistoricTaskInstanceEndTime()
                .asc()
                .taskAssignee(assignee)
                .list();
        if (!CollectionUtils.isEmpty(historicTasks)) {
            historicTasks.forEach(historicTaskInstance -> {
                System.out.println("Id:" + historicTaskInstance.getId());
                System.out.println("ProcessInstanceId:" + historicTaskInstance.getProcessInstanceId());
                System.out.println("Name:" + historicTaskInstance.getName());
            });
        }
    }

    /**
     * 根据流程实例ID查询历史
     */
    @Test
    public void listHistoricTasksByProcessInstanceId() {
        String processInstanceId = "0f8a9b00-479e-11ed-af85-e4a8dfd43d4a";
        List<HistoricTaskInstance> historicTasks = this.historyService.createHistoricTaskInstanceQuery()
                .orderByHistoricTaskInstanceEndTime()
                .asc()
                .processInstanceId(processInstanceId)
                .list();
        if (!CollectionUtils.isEmpty(historicTasks)) {
            historicTasks.forEach(historicTaskInstance -> {
                System.out.println("Id:" + historicTaskInstance.getId());
                System.out.println("ProcessInstanceId:" + historicTaskInstance.getProcessInstanceId());
                System.out.println("Name:" + historicTaskInstance.getName());
            });
        }
    }
}
UEL表达式#
  • 表达式以 ${ 开始;} 结束,例如:$
  • 支持逻辑运算:$
  • 支持变量(变量名必须小写)与实体类赋值

涉及数据表:act_hi_varinst、act_ru_variable

BPMN2.0网关#

并行网关(Parallel gateway)#

注意:并行网关有开始就要有结束

排他网关(Exclusive gateway)#

包容网关(Inclusive gateway)#

注意:包容网关是并行网关的一种衍生,所以也是成对出现

事件网关(Event gateway)#

作者:mountainstudy

出处:https://www.cnblogs.com/mountainstudy/p/17953905

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

Activiti7 基本使用教程 Activiti由Alfresco软件开发,目前最高版本Activiti 7。是BPMN的一个基于java的软件实现,不过 Activiti 不仅仅包括BPMN,还有DMN决策表和CMMN Case管理引擎,并且有自己的用户管理、微服务API 等一系列功能,是一个服务平台。在Activiti7中。我们启动服务会自动维护Activiti7需要使用到的相关的表结构。在这块我们需要有个大概的了解。Activiti数据库类型示例 JDBC URL备注h2默认配置的数据库mysql。 阅读详情

相关推荐

SpringBoot整合Activiti工作流完整指南

本文摘要: SpringBoot整合Activiti工作流开发指南提供了从基础到实战的完整解决方案。文章首先介绍工作流引擎核心概念和BPMN2.0标准,然后详细讲解开发环境搭建、SpringBoot集成配置和项目结构设计。实战部分包含请假流程和复杂报销流程的建模示例,覆盖流程变量管理、条件表达式设计和表单处理等核心功能。高级特性章节探讨了任务监听器、执行监听器和自定义服务任务的实现,以及性能监控与优化策略。最后提供了数据库配置、缓存优化和常见问题解决方案等最佳实践。通过REST API设计示例和完整项目代码

weixin_51040479的博客 2623

Springboot 3集成最新版activiti 8.6,一次成功,完美避坑

笔者基于activiti 5.23开发了一个深度定制的流程引擎,由于activiti5官方已经放弃更新了,因此长远来看,activiti5迟早要放弃,笔者经过持续观察和调研.最终决定放弃升级到flowable,而是选择升级到activiti最新版,目前是8.6版本.由于activiti6以后资料较少,为了帮助广大开发者快速投入到activiti最新版本使用,笔者决定将自己升级过程中的一些经验,教训,关键步骤等记录下来写成博客形式分享出来.

周国通的博客 4270

二十一、SpringBoot2核心技术——整合activiti7

一、Activiti7与SpringBoot整合 Activiti7发布正式版之后,它与SpringBoot2.x已经完全支持整合开发。 1.1、SpringBoot整合Activiti7的配置 为了能够实现SpringBoot与Activiti7整合开发,首先我们要引入相关的依赖支持。 在工程的pom.xml文件中引入相关的依赖,其中activiti的依赖是:activiti-spring-boot-starter。 具体依赖如下所示: <?xml version="1.0" encoding="U

付之一笑的专栏 3692

springboot3整合activiti 8(DEMO)含代码

目录1 项目版本介绍2 引入的依赖3 添加配置类(因为activiti内置了springboot的安全框架,所以需要配置)4 添加安全工具类(也是因为安全框架)5 在项目运行前,需要手动建表6 yml配置7 启动即可该项目仅作为Demo使用,仅作为工作流学习的项目,以此学习工作流activiti的基本操作。mysql-connector-jlombokspring-boot-starter-testspring-boot-starter-jdbcactiviti-spring-boot-starterjun

weixin_51503703的博客 1万+

Spring Boot 整合 Activiti 工作流入门

在许多业务场景中,我们需要自动化处理一些业务流程,比如审批流程、订单处理流程等。Activiti 提供了一套完整的解决方案,可以帮助我们轻松地实现这些需求,并且它还支持 BPMN 2.0 标准,这意味着你可以使用图形化工具设计流程图。此外,如果需要更复杂的流程设计,可以考虑使用 Activiti Designer 或者其他 BPMN 设计工具。点击后,流程将被启动,并在任务列表中显示待处理的任务。点击任务,你会看到任务表单,填写完表单后点击提交,任务将被完成。接下来,我们需要创建一个简单的流程定义。

java专栏 1882

SpringBoot与Activiti7整合实战:前后端代码示例

Activiti7是基于Apache许可的Java业务流程管理套件(BPMS),由Alfresco公司支持和开发。随着企业业务流程复杂性的增加,传统的业务流程管理系统已经无法满足现代企业的快速迭代和敏捷开发需求。Activiti7的推出,正是为了解决这一问题,它不仅拥有传统BPMS的功能,还强调轻量级、模块化、易于集成和扩展性。优势分析:轻量级与高性能:Activiti7设计上追求轻量级,对资源的占用更少,尤其适合微服务架构,可以实现高效的业务流程管理。

weixin_32287387的博客 799

Spring boot 3.x Activiti7 启动失败问题

升级springboot3.x,导致activiti7无法启动。

sinat_35670743的博客 3820

SpringBoot整合Activiti流程设计与实战

本文还有配套的精品资源,点击获取 简介:在企业级应用开发中,流程自动化是关键环节。SpringBoot 与 Activiti 的结合为业务流程管理(BPM)提供了高效灵活的解决方案。Activiti 是基于 BPMN 2.0 的开源工作流引擎,支持流程建模、执行与持久化,而 SpringBoot 简化了 Spring 项目的搭建与部署。本文详细介绍了 SpringBoot 集成 Activiti 的配置流程,包括依赖引入、流程引擎初始化、流程定义与部署、任务处理与业务逻辑整合等内

weixin_42620563的博客 715

【Activiti7系列】Activi7简介和基于Spring Boot整合Activiti7(流程设计器)

本文将介绍Activiti7基础概念及基于SpringBoot整合Activiti7(流程设计器)的具体步骤。

c18213590220的博客 6564

Flowable高级篇 -6.8.0 最全表结构说明-主要表结构字段注释

flowable 28张表 详细

billzhen的博客 1万+

阻容降压 vs 开关电源:5V小功率供电方案成本与安全深度对比

本文深度对比了阻容降压电路与开关电源在5V小功率供电方案中的核心差异。重点剖析了二者在成本、体积、效率、温升及安全隔离等方面的优劣,并结合智能温控器、LED驱动等典型应用场景,为硬件工程师提供了清晰的选型决策框架,帮助在成本与安全之间做出最佳权衡。

weixin_29310631的博客 702

前后端分离Springboot 整合使用activiti7教程(一)(全网最细)

SpringBootyuActiviti7的详细整合使用,笔记整理不易,请继续关注订阅专栏

谁说自己不可以 1万+

关于华为高斯数据库出现Invalid or unsupported by client SCRAM mechanisms定位解决的过程

最近公司有个新项目使用的是高斯数据库,因为我们的项目是直接从别的项目组拿来的,配置都是已经配好的,但是在放到正式环境上之后出现报错。起初我们以为是测试和正式的版本不一致,但是结果是版本一致的。最后这个问题搞了我们几个小时,都没法解决。

Curtisjia的博客 3176

SpringBoot整合activiti7学生请假示例

Java版本:1.8 SpringBoot版本<version>2.4.4</version> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>

Good Luck 8万+

从零到一:RK3588平台上的星闪模块驱动移植全解析

本文详细解析了在RK3588平台上移植UB37星闪模块驱动的完整流程,涵盖内核配置、设备树适配、驱动编译、功能测试等关键步骤。通过实践指导,帮助开发者掌握星闪技术在嵌入式系统中的集成与应用,提升无线通信模块的开发效率。

qsc90123456的博客 337

从询价到回款:一篇讲透 SAP SD 销售与分销的实战入门指南

摘要: SAP SD(Sales and Distribution)模块是SAP ERP中管理销售与分销的核心组件,贯穿从订单到回款(Order-to-Cash)的全流程。其核心价值在于将销售业务结构化,通过主数据(客户、物料、定价)和交易单据(订单、交货、发票)实现流程可审计、可自动化。SD模块与物流(MM)、生产(PP)、财务(FI)深度集成,涵盖定价策略、信用控制、发运管理、国际贸易等复杂场景。关键设计包括条件技术(Condition Technique)实现灵活定价,单据流(Document Flo

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 256

【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(上篇)

《基于Spring Security的Activiti7工作流管理系统简介及实现》将对Activiti7工作流管理系统进行介绍,同时会讲解核心技术路线及代码原理,手把手教你搭建文中的工作流管理系统。

c18213590220的博客 1588

电气:蒙特卡洛1000个风光场景并通过削减法|聚类法得到几个典型场景(matlab\python实现)

    个人电气目录传送门:学好电气全靠它,个人电气博文目录(持续更新中…)     本文内容包括22页(代码和一些自己对风光的观点) 提示:专栏解锁后,可以查看该专栏所有文章,划算。 文章目录一、理论依据1.风电DG出力概率模型1.2光伏DG出力概率模型1.3对风光的认识二、蒙特卡洛模拟1000个风光场景、并通过削减法得到5个典型风电场景 (Matlab 版程序)三、蒙特卡洛模拟1000个风光场景、并通过聚类法得到5个典型

总裁余(余登武)博客 7681

Activiti7使用

Acitviti7工作流引擎 视频地址:springboot2+Vue+shiro云管理系统项目实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 工作流引擎: 流程自动化配置。 工作流系统:具有工作流的系统。 如何以不变应万变? ​ -----activiti就可以实现业务流程变化后,程序代码不需要改变 适用行业: 使用场景及相关业务: SaaS-人力资源管理系统 行政审批(调薪) 为什么activiti就可以解决业务需求变更时,源代码不需要更新,而是更新业务流程图?原理? activit

weixin_45204213的博客 1337

innovus: 如何让两个generate clock balance skew group?

如题,在sdc约束中两个generate clock被设置到同一个clock group中,工具虽然会生成对应的两个skew group,但是阅读ccoot_spec发现工具并没有让两个skew group进行balance,这时就需要手动设置balance skew group。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 4049

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

若依cloud微服务集成activiti7或activiti8

微服务集成activiti

weixin_37698534的博客 1344

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SpringBoot整合Activiti7实战:如何绕过SpringSecurity实现纯流程引擎集成

本文详细介绍了SpringBoot整合Activiti7的轻量级流程引擎集成方案,重点解决了如何绕过SpringSecurity实现纯流程引擎集成的问题。通过排除SpringSecurity依赖、最小化安全配置和自定义用户服务三种策略,开发者可以在不引入复杂权限体系的情况下快速构建基于Activiti7的流程应用。文章还提供了流程部署、任务处理、性能优化等实战示例,适合需要基础流程功能的企业级应用开发。

weixin_29214199的博客 218

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

基于SpingBoot2.0与activiti7.x构建的一套工作流程管理系统

Active4j-flow是基于SpingBoot2.0与activiti7.x开发的一套工作流程管理系统。是以active4j-jsp为项目基础架构构建而成。以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,JSP作为前端页面引擎,采用JSTL标签库封装组...

active4j的专栏 2936

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

工作流学习日志-(Activiti7与spring、SpringBoot整合)

工作流学习日志-(spring、springboot整合) 文章目录工作流学习日志-(spring、springboot整合)前言一、工作流Activiti7与spring整合1. 依赖注入2. 整合配置文件3. 测试代码二、使用步骤1.引入库2.读入数据总结 前言 开发OA人力资源管理系统时在人员调动时、请假审批等需要使用到工作流,以此作为学习契机。 一、工作流Activiti7与spring整合 1. 依赖注入 与spring整合时的pom.xml文件依赖。 <?xml version="1.0

weixin_46621774的博客 510

SpringBoot整合Activiti学习(一)

前言 只有学到手的才是自己的,加油,boy!!! 环境 JDK版本 JAVA version "1.8.0_212" IDEA 2020.1 SpringBoot 2.3.2.RELEASE activiti-spring-boot-starter 7.1.0.M5 搭建 pom结构如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apach.

qq_37764782的博客 553
上一篇: 解决使用PowerShell不能运行cnpm
下一篇: Java——Pair与Tuple
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值