JeecgBoot集成工作流实战教程

news2024/11/26 8:53:17

Activiti是一个轻量级的工作流程和业务流程管理(BPM)平台,它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的,并且基于Apache许可证进行分发。它可以运行在任何Java应用程序、服务器、集群或云环境中,并且与Spring框架完美集成,以其轻量级和基于简单概念的特点而闻名

Activiti在中国市场的情况

Activiti的工作流引擎功能包括流程定义与建模、流程执行与管理、集成与扩展等。它适用于各行各业的业务流程自动化,包括消费品行业、制造业、电信服务业、金融服务业、物流服务业、政府事业机构等。Activiti的工作流引擎可用于构建各种类型的工作流,如审批流程、业务流程等,通过定义清晰的流程和任务分配规则,企业可以提高工作效率,减少人为错误,并实现流程的自动化。由于activiti发展比较早,在国内各种新老系统都有广泛应用。

如果您是一名新手,该如何快速将Activiti工作流用于自己的业务开发? 我们推荐使用JeecgFlow,这套技术脚手架将帮您快速提高效率。接下来,本文将通过JeecgBoot如何集成Activiti工作流进行阐述,助力您自己动手实现一些简单的Demo!

环境介绍

项目版本
JeecgBoot3.6.1
Activiti7.0.0.Beat2
jdk1.8

JeecgBoot新增activiti模块

首先,我们要新建一个模块,命名成:jeecg-module-activiti, 与现有的命名方式保持一致。在这个模块去做activiti工作流相关的业务。

1.在项目中,点击右键,选择module

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

2.直接进入创建模块,不要选择任何依赖。

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

3.完成模块命令,写入jeecg-module-activiti

在这里插入图片描述

添加图片注释,不超过 140 字(可选)

<dependency>
    <groupId>org.jeecgframework.boot</groupId>
    <artifactId>jeecg-boot-base-core</artifactId>
</dependency>

并在该模块下加入上述依赖。 这个是jeecg的核心模块,也是一个公共模块。

4.在jeecg-boot-module-system的start模块的pom.xml引入新增的activit模块

    <dependency>
            <groupId>org.jeecgframework.boot</groupId>
            <artifactId>jeecg-module-activiti</artifactId>
            <version>${jeecgboot.version}</version>
        </dependency>

5.swagger配置

在swagger配置新模块的swagger扫描bean.找到Swagger2Config。追加如下Bean配置。

@Bean
public Docket loanApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .apiInfo(apiInfo()).groupName("会员模块")
            .select()
            //此包路径下的类,才生成接口文档
            .apis(RequestHandlerSelectors.basePackage("org.jeecg.crm"))
            //加了ApiOperation注解的类,才生成接口文档
            .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
            .paths(PathSelectors.any())
            .build()
            .securitySchemes(Collections.singletonList(securityScheme()));
    //.globalOperationParameters(setHeaderToken());
}

6.mybatis-plus配置

mybatis-plus在application.yml中的配置.

mybatis-plus:
  mapper-locations: classpath*:classpath*:org/jeecg/activiti/**/xml/*Mapper.
  • mybatis-plus配置类的配置.MybatisPlusSaasConfig配置mapper文件扫描路径
@Configuration
@MapperScan(value={"org.jeecg.modules.**.mapper*","org.jeecg.activiti.**.mapper*"})
public class MybatisPlusSaasConfig {
}

完成以上配置, 你可以往这个模块建表。到这也就完成第一步。模块建立。 接下来说明下如何完善activiti模块的依赖和配置。

Activiti模块的安装和配置

项目父pom.xml中新增activiti的依赖

<dependencyManagement>
    <dependencies>
        <!--以下是所需的依赖文件-->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.0.0.Beta2</version>
            <exclusions>
                <exclusion>
                    <!-- 重点坑,不排除mybatis的话,在启动项目时会报错mybatisplus缺少类   -->
                    <artifactId>mybatis</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>
</dependencyManagement>

jeecg-module-activit模块的依赖

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <!-- 重点坑,不排除mybatis的话,在启动项目时会报错mybatisplus缺少类   -->
            <artifactId>mybatis</artifactId>
            <groupId>org.mybatis</groupId>
        </exclusion>
    </exclusions>
</dependency>

注意啦!需要将这个模块在jeecg-module-system/jeecg-system-start模块的pom.xml新增,如下

<dependencies>
    <!-- SYSTEM 系统管理模块 -->
    <dependency>
        <groupId>org.jeecgframework.boot</groupId>
        <artifactId>jeecg-system-biz</artifactId>
        <version>${jeecgboot.version}</version>
    </dependency>
    <!-- Activiti模块 -->
    <dependency>
        <groupId>org.jeecgframework.boot</groupId>
        <artifactId>jeecg-module-activti</artifactId>
        <version>${jeecgboot.version}</version>
    </dependency>
    <!-- DEMO 示例模块 -->
    <dependency>
        <groupId>org.jeecgframework.boot</groupId>
        <artifactId>jeecg-module-demo</artifactId>
        <version>${jeecgboot.version}</version>
    </dependency>
    
    <!-- flyway 数据库自动升级 -->
    <dependency>
        <groupId>org.flywaydb</groupId>
        <artifactId>flyway-core</artifactId>
    </dependency>
</dependencies>

application.yml配置

spring:
    activiti:
        #1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
        #2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
        #3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
        #4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
        database-schema-update: true
        # 检测历史信息表是否存在,activiti7默认不生成历史信息表,开启历史表
        db-history-used: true
        # 历史记录存储等级
        history-level: full
        check-process-definitions: true

mysql配置->nullCatalogMeansCurrent=true

url: jdbc:mysql://rxxx/jeecg-camunda?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
//需要在尾部追加nullCatalogMeansCurrent=true
//如果不追加, 可能会出现cause: java.sql.SQLSyntaxErrorException: 
Table 'jeecg-camunda.act_ge_property' doesn't exist

Activiti7 中自带的 Security 安全框架排除掉(因为我这里使用的是 Shiro 安全框架,Security 就没什么用处了)

@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, SecurityAutoConfiguration.class,
        SecurityAutoConfiguration.class,
        ManagementWebSecurityAutoConfiguration.class})
public class OAApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(OAApplication.class, args);
        System.out.println("启动成功~");
    }
}

上面排除 Security 安全框架的操作对于 Activiti 7.1.0.M6 这个版本是没用的,
因为这个版本的代码强引用了 SpringSecurity 里的内容,
比如在 Activiti 的 SpringBoot 配置类中,强引用 UserDetailsService,
没有这个就会报错,所以我们还需要把版本降到7.1.0.M4及以下。

代码编写

@ApiOperation(value = "启动流程", notes = "启动流程")
@PostMapping("/start")
public Result<?> start(@RequestBody LeaveReq leaveReq) {
    log.info("start.leaveReq:{}" + Thread.currentThread().getId());
    LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
    //启动流程&&并设置启动人
    Authentication.setAuthenticatedUserId(loginUser.getUsername());
    Map<String, Object> variables = new HashMap<>(4);
    variables.put("general", loginUser.getUsername());
    variables.put("guide", "诸葛亮");
    variables.put("leader", "刘备");
    ProcessInstance processInstance =     runtimeService.startProcessInstanceByKey(leaveReq.getModelKey(), variables);
  }

综上就是一个Activiti工作流在JeecgBoot开源项目中集成并且简易运行的案例, 更多详情,请访问JeecgFlow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2232137.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python3】【力扣题】409. 最长回文串

【力扣题】题目描述&#xff1a; &#xff08;题意理解&#xff09;统计如下&#xff1a; ① 字母个数本身是偶数。 ② 字母个数是奇数&#xff0c;统计奇数中的偶数部分&#xff0c;例如&#xff1a;字母个数为3&#xff0c;统计其中的2。 ③ 中间可以有一个奇数字母。即只要有…

链接分析与反向链接的重要性及最佳实践解析

内容概要 链接分析与反向链接是网络营销和搜索引擎优化的两个基本要素。了解这些概念的基础知识&#xff0c;能够帮助网站管理员和市场营销者更好地掌握搜索引擎的运作机制。链接分析主要是指评估网站之间的连接关系&#xff0c;通过研究不同网页之间的链接情况&#xff0c;找…

HTML 基础标签——链接标签 <a> 和 <iframe>

文章目录 1. `<a>` 标签属性详细说明示例2. `<iframe>` 标签属性详细说明示例注意事项总结链接标签在HTML中是实现网页导航的重要工具,允许用户从一个页面跳转到另一个页面或嵌入外部内容。主要的链接标签包括 <a> 标签和<iframe> 标签。本文将深入探…

分拣线番茄分级缺陷识别图像分割系统:创新探讨教学

分拣线番茄分级缺陷识别图像分割系统源码&#xff06;数据集分享 [yolov8-seg-timm&#xff06;yolov8-seg-dyhead-DCNV3等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源A…

RTP和RTCP的详细介绍及其C代码示例

RTP和RTCP的详细介绍及其C代码示例 RTP和RTCP简介RTP协议详解RTCP协议详解RTP和RTCP之间的关系C代码示例RTP和RTCP简介 RTP(Real-time Transport Protocol,实时传输协议)和RTCP(Real-time Transport Control Protocol,实时传输控制协议)是流媒体传输中常用的两个协议。R…

微服务系列三:微服务核心——网关路由

目录 前言 一、登录存在的问题归纳 二、*微服务网关整体方案 三、认识微服务网关 四、网关鉴权实现 五、OpenFeign微服务间用户标识信息传递实现 六、微服务网关知识追问巩固 前言 本篇文章具体讲解微服务中网关的实现逻辑、用于解决什么样的问题。其中标题中标注* 涉…

开源一个开发的聊天应用与AI开发框架,集成 ChatGPT,支持私有部署的源码

大家好&#xff0c;我是一颗甜苞谷&#xff0c;今天分享一个开发的聊天应用与AI开发框架&#xff0c;集成 ChatGPT&#xff0c;支持私有部署的源码。 介绍 当前系统集成了ChatGPT的聊天应用&#xff0c;不仅提供了基本的即时通讯功能&#xff0c;还引入了先进的AI技术&#x…

心觉:人每日60000念头,如何让你的时间精力只专注于核心目标?

Hi&#xff0c;我是心觉&#xff0c;带你用潜意识化解各种焦虑、内耗&#xff0c;建立无敌自信&#xff1b;教你财富精准显化的实操方法&#xff1b;关注我,伴你一路成长&#xff01; 每日一省写作220/1000天 据说一个人每天会产生60000个念头 有些我们的意识能察觉到&#x…

万宇科技闪耀创新舞台 荣膺潜在独角兽企业殊荣

2024年10月24日&#xff0c;在“2024东北亚(沈阳)人才交流大会暨中国潜在独角兽企业发展大会”上&#xff0c;长城战略咨询重磅发布《GEI中国潜在独角兽企业研究报告2024》&#xff0c;揭示了中国潜在独角兽企业群体的最新发展态势。其中&#xff0c;安徽万宇机械设备科技有限公…

论文阅读:Computational Long Exposure Mobile Photography (一)

这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章&#xff0c;介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像&#xff0c;用运动模糊来呈现场景中的移动元素。它通常有两种模式&#xff0c;分别产生前景模糊或…

数据结构与算法 - 基础

本文首发于 个人博客 程序 数据结构 算法 其实很多同学知道数据结构与算法很重要&#xff0c;但是却不明觉厉。 这里我们看一个简单的题&#xff1a; 对自然数从1到100的求和 最简单的设计无非是&#xff1a; void addNum () { int total 0; for (int i 1; i < 1…

算法简介:动态规划

动态规划 1. 动态规划2. 案例2.1 旅游行程最优化 1. 动态规划 背包问题&#xff1a;背包可以容纳的重量是4磅&#xff0c;吉他为1磅&#xff0c;价值1500元&#xff1b;音响为4磅&#xff0c;价值3000元&#xff1b;笔记本电脑为3磅&#xff0c;价值为2000元。如何在背包中放入…

GPU 学习笔记四:GPU多卡通信(基于nccl和hccl)

文章目录 一、前沿1.1 背景回顾1.2 XCCL在AI通信架构中的位置和作用 二、英伟达GPU通信 nccl2.1 NCCL简介2.2 通信模式2.2.1 通信模式分类2.2.2 通信模式分析2.2.3 通信nccl编程实例 2.3 NCCL通信算法2.3.1 环形算法 ring algorithm2.3.2 树形算法 tree algorithm 防止遗忘和后…

最新PHP校园源码系统开发(多客社区校园系统源码全套APP源码附搭建教程)

最新PHP校园源码系统开发、多客社区校园系统源码以及全套APP源码附搭建教程的需求 一、最新PHP校园源码系统开发 技术栈选择&#xff1a; 后端&#xff1a;PHP&#xff08;建议使用PHP 7.2或更高版本&#xff09;数据库&#xff1a;MySQL&#xff08;建议使用MySQL 5.6或更高版…

Netty 组件介绍 - ByteBuf

直接内存&堆内存 ByteBuf buffer ByteBufAllocator.DEFAULT.heapBuffer(10);ByteBuf byteBuf ByteBufAllocator.DEFAULT.directBuffer(10); 组成 ByteBuf维护了两个不同的索引&#xff0c;一个用于读取&#xff0c;一个用于写入。 写入 内存回收 堆内存使用的是JVM内…

Java项目实战II基于Java+Spring Boot+MySQL的高校办公室行政事务管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在高等教育…

word mathml 创建粗体字母快捷键

在 mathml 中达到latex中 \mathbf{A} 的效果 由于word本身不支持这个命令&#xff0c;所以打算用快捷键实现 快捷键的功能是加粗光标前一个字目 1. Alt F8 打开宏&#xff0c;如果打不开可以尝试 Alt Fn F8 2. 输入 BoldPreviousCharacter 新建宏&#xff1a; Sub Bold…

redis实现分布式锁,go实现完整code

Redis分布式锁 Redis 分布式锁是一种使用 Redis 数据库实现分布式锁的方式&#xff0c;可以保证在分布式环境中同一时间只有一个实例可以访问共享资源。 实现机制 以下是实现其加锁步骤&#xff1a; 获取锁 在 Redis 中&#xff0c;一个相同的key代表一把锁。是否拥有这把锁&…

flink 自定义kudu connector中使用Metrics计数平均吞吐量,并推送到自定义kafkaReporter

文章目录 前言1. Registering metrics2. Metrics 的类型2.1 counter2.2 Gauge2.3 Histogram2.4 meter 3. 指标划分3.1 指标所属的范围3.2 默认所属 4. 自定义kudu connector中使用Metrics4.1 sink算子继承RichFunction4.2 注册指标4.3 计数逻辑4.4 自定义Reporter&#xff0c;推…

柯桥日语培训|N1常考语法:~(よ)うが/(よ)うと——“无论……都……”

&#xff5e;&#xff08;よ&#xff09;うが&#xff0f;&#xff08;よ&#xff09;うと 接续&#xff1a;動意向形&#xff0f;イ形→かろう&#xff0f;名、ナ形→だろう・であろう&#xff0b;が&#xff0f;と 说明&#xff1a;表示假定条件的逆接&#xff0c;无论前项如…