原文链接:https://www.longkui.site/program/development/spring-boot-activiti1/5486/
0.背景
工作中,一项任务需要用到工作流,首先接触的是ruoyi-vue-activiti。原作者对工作流进行了简单封装,然后制作出了ruoyi-vue-acitiviti,中间有些细节没太搞明白,今天这篇文章记录下用SpringBoot集成activity过程。
工具:IDEA、mysql、spring boot(2.7.7)、activiti-spring-boot-starter(7.1.0.M6)、mybatis(2.1.4)
1.创建项目
我们创建一个spring boot项目,初始的pom文件如下:
4.0.0
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.7</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>org.example</groupId>
<artifactId>activiti</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
</properties>
<!--依赖-->
<dependencies>
<!--spring-boot-web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!--activiti依赖-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M6</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M6</version>
<type>pom</type>
</dependency>
</dependencies>
然后在resuorces文件夹下创建配置文件application.yml。
初始的配置文件参考如下:
server:
port: 8090 #端口
spring配置
spring:
#mysql配置
datasource:
url: jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
#工作流activiti配置
activiti:
#名字
database-schema: ACTIVITI
#自动更新数据库结构
#1.flase:默认值。activiti在启动时,对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
#2.true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建
#3.create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
#4.drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
database-schema-update: true
#activiti7默认不生成历史信息表,开启历史表
db-history-used: true
#记录历史等级 可配置的历史级别有none, activity, audit, full
#none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
#activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
#audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
#full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
history-level: full
#自动检查、部署流程定义文件
check-process-definitions: false
# asyncExecutorActivate是指activiti在流程引擎启动就激活AsyncExecutor,异步:true-开启(默认)、false-关闭
async-executor-activate: true
同时,需要对应创建一个数据库,名字就是上面配置的名字。
然后创建启动类:
package site.longkui.activiti;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Activiti {
public static void main(String[] args) {
SpringApplication.run(Activiti.class, args);
}
}
2.增加服务类
上面代码我们如果启动的话会报错,我们需要创建服务类。这里我们创建了四个文件夹,controller、entity、mapper、service,用来后期进行扩展。
我们在sevice层创建如下代码:
package site.longkui.activiti.service;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
public User findOneUserByName(String username){
List<GrantedAuthority> authorities = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
return new User(username,"",authorities);
}
}
然后去实现这个方法:
package site.longkui.activiti.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import site.longkui.activiti.service.UserService;
@Component
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userService.findOneUserByName(username);
}
}
然后启动项目,就可以看到我们创建的数据表中生成了新的25张新表。