由于工作需要,需要实现自定义审核流程,就查找资料实现,这是我实现的步骤。
Activiti官方网站:http://activiti.org/download.html
一、idea安装activiti
地址: https://plugins.jetbrains.com/
搜索: actiBPM
二、使用activiti
将bpmn文件放到resources下的processes下,springboot启动时会自动部署
2.1 在resource下面创建BpmnFile文件
id要唯一
2.2 添加图标
鼠标左键拖拽StartEvent到界面上,同样再弄几个其他图标
2.3 生成图片
右键进行改名,把后缀改为.xml结尾
然后在改成的xml文件上面右键点击show BPMN 2.0Designer…
出现这个界面点击箭头指的图标,选择项目的resourcr文件夹(或者再在下面创建一个文件),把生成的.png图片存储进去
2.4 图片的中文乱码问题
可能生成的图片会有中文乱码问题,如下解决:
不过如果有中文会出现乱码,需要在这两个文件下的后面都加上-Dfile.encoding=UTF-8
然后重启IDEA,把原来的PNG图片删掉,再生成一次就不会出现乱码了
将bpmn文件放到resources下的processes下,springboot启动时会自动部署
三、springboot项目整合activiti
3.1 依赖
<!-- mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Activiti 各个依赖的版本要一致要不然启动不了的-->
<!-- Activiti 启动器-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>5.23.0</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Activiti 流程图-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>5.23.0</version>
</dependency>
<!-- Activiti 在线设计-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>5.23.0</version>
</dependency>
<!-- <dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.23.0</version>
</dependency>-->
3.2 解决中文乱码需要添加一个配置类
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
/**
* activiti的配置类
* 解决activiti的中文乱码问题
*
* @author lc
* @version 1.0
* @date 2022/4/27 9:32
*/
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
@Override
public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {
springProcessEngineConfiguration.setLabelFontName("宋体");
springProcessEngineConfiguration.setActivityFontName("宋体");
}
}
3.3 application.yml配置
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/spbt-activiti7?nullCatalogMeansCurrent=true
driver-class-name: com.mysql.cj.jdbc.Driver
devtools:
restart:
enabled: true #设置开启热部署
activiti:
database-schema-update: true
history-level: full
db-history-used: true
check-process-definitions: false # 是否开启自动部署,false表示不开起
# process-definition-location-prefix: classpath:/processes/ # 自动部署的时候打开这个
async-executor-activate: false # 启用异步执行器
job-executor-activate: false # 启用作业执行器
配置解释
- database-schema-update配置项可以设置流程引擎启动和关闭时数据库执行的策略,database-schema-update有以下四个值:
false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
- history-level对于历史数据,保存到何种粒度,Activiti提供了history-level属性对其进行配置。history-level属性有点像log4j的日志输出级别,该属性有以下四个值:
none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
-db-history-used为true表示使用历史表,如果不配置,则工程启动后可以检查数据库,只建立了17张表,历史表没有建立,则流程图及运行节点无法展示。
3.4 启动,会自动生成25张表到数据库中
各个表的含义:
ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 通用数据, 用于不同场景下。
3.5 启动报错解决
3.5.1 问题一:java.io.FileNotFoundException:
class path resource [org/springframework/security/config/annotation/authentication/configurers/GlobalAuthenticationConfigurerAdapter.class] cannot be opened because it does not exist
解决办法:
启动项上方@SpringBootApplication注解里面加exclude = SecurityAutoConfiguration.class
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
注意:SecurityAutoConfiguration.class导入的包是 activiti的
正确的
import org.activiti.spring.boot.SecurityAutoConfiguration;
错误的:
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
3.5.2 问题二、java.lang.ClassNotFoundException:
org.activiti.bpmn.model.AdhocSubProcess
这是由于activiti在pom中的依赖版本不一致,要填写一致版本的依赖
3.5.2 问题三、Table ‘newsell.act_ge_property’ doesn’t exist
在mysql的连接字符串上加上nullCatalogMeansCurrent=true
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/newsell?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=true&nullCatalogMeansCurrent=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
3.6 按照使用activiti的方法操作一遍得到正常的就说明对了
流程文件部署,部署方式分为两种:自动部署和手动部署【有时候自动部署不会成功】
自动部署:将bpmn文件放到resources下的processes下,springboot启动时会自动部署,部署对应的表为:act_re_deployment;
手动方式部署:在maven项目的测试文件夹下,新建测试类(TestActiviti),并编写测试方法,进行流程文件部署,部署代码如下;
import org.activiti.engine.RepositoryService;
// 手动方式部署
@Autowired
private RepositoryService repositoryService;
@GetMapping("/test")
public void test(String[] args) {
Deployment deployment = repositoryService.createDeployment().name("测试流程文件部署")
.addClasspathResource("processes/test001.bpmn")
.addClasspathResource("processes/test001.png").deploy();
System.out.println("部署id为:"+deployment.getId());
System.out.println("部署名称为:"+deployment.getName());
}
四、使用activiti