一.简介
对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档:https://www.flowable.org/docs/userguide/index.html
Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释:Flowable是一个用java语言写的轻量级工作流引擎。
在实际开发中,很少会直接用到 flowable 中的用户体系,但是毕竟官方设计了这个东西,而存在就必然有其合理性。写个 Spring Boot 的demo,学习怎么去添加、删除、修改一个用户或者组。
二.springboot整合flowable
1.使用版本
springBoot版本:2.3.2.RELEASE
flowable版本:6.5.0
2.创建项目
创建一个 SpringBoot 项目,引入 Web、和 MySQL 驱动两个依赖,截图如下:
3.项目依赖pom.xml
springboot 版本
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-engine</artifactId>
<scope>compile</scope>
<version>6.5.0</version>
<exclusions>
<exclusion>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-spring-boot-starter-basic</artifactId>
<version>6.5.0</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-bpmn-layout</artifactId>
<version>6.5.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
4.项目配置application.yml
数据库和flowable的配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/flowable?useSSL=false&characterEncoding=UTF-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
flowable:
database-schema-update: true
# flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。(生产环境常用)
# true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。(开发时常用)
# create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。(单元测试常用)
# drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。
process:
definition-cache-limit: -1
activity-font-name: 宋体
label-font-name: 宋体
annotation-font-name: 宋体
check-process-definitions: false
process-definition-location-prefix: classpath*:/processes/
process-definition-location-suffixes: **.bpmn20.xml,**.bpmn
flowable.check-process-definitions:这个表示是否在项目启动的时候,去检查文件目录是否有对应的流程文件,该属性为 true 表示如果有流程文件就自动部署,false 表示不检查,那么也就不会自动部署。
flowable.process-definition-location-prefix:这个是流程文件的位置,默认就是 classpath*:/processes/,当然开发者也可以进行配置。
flowable.process-definition-location-suffixes:这个是流程文件的后缀,默认有两个,分别是 **.bpmn20.xml 和 **.bpmn,当然开发者也可以进行配置。
flowable的配置,再默认情况下,位于 resources/processes 的流程都会被自动部署。
配置完成后,就可以启动项目了。项目启动成功之后,flowable 数据库中就会自动创建如下这些表,会自动初始化数据库,将来流程引擎运行时候的数据会被自动持久化到数据库中。。数据库表的截图如下:
三.用户操作
在 Spring Boot 中,flowable 默认已经给我们配置好了 IdentityService 对象,我们只需要将之注入到项目中就可以使用了。
1.添加用户接口
代码如下:
@Autowired
IdentityService identityService;
@Test
void contextLoads() {
UserEntityImpl user = new UserEntityImpl();
user.setId("javaboy");
user.setDisplayName("江南一点雨");
user.setPassword("123");
user.setFirstName("java");
user.setLastName("boy");
user.setEmail("javaboy@qq.com");
user.setRevision(0);
identityService.saveUser(user);
}
需要注意的是 revision 的值为 0 表示这是一个新添加的用户。
添加之后,我们在数据库的 ACT_ID_USER 表中,就可以看到刚刚加入的数据了:
2.修改用户接口
如果是修改用户密码,可以调用如下方法:
@Test
void test02() {
UserEntityImpl user = new UserEntityImpl();
user.setId("javaboy");
user.setPassword("666");
user.setRevision(1);
identityService.updateUserPassword(user);
}
虽然这个方法名是 updateUserPassword,但是实际上这个也能修改其他属性。
这里有一个点要注意,就是用户用到了乐观锁,所以修改的时候,要自己把 revision 写对了,否则修改会失败,然而我们往往并不记得 revision 是多少,所以最好是先查询,后修改,如下:
@Test
void test03() {
User u = identityService.createUserQuery().userId("javaboy").singleResult();
u.setDisplayName("itboy");
identityService.updateUserPassword(u);
}
如果是强行给一个不匹配的 revision,执行的时候会报如下错误:
当然,修改用户的时候也可以调用 saveUser 方法,这个方法会根据用户 id 查询用户,如果用户已经存在,则直接修改(修改 password 之外的其他属性),否则就添加。
3.删除用户接口
根据用户 id 删除一个用户,代码如下:
@Test
void test05() {
identityService.deleteUser("javaboy");
}
4.查询用户
查询方式比较丰富,通过用户的各个属性都可以查询,例如可以查询所有姓黄的用户,代码如下:
@Test
void test06() {
List<User> list = identityService.createUserQuery().userDisplayNameLike("黄%").orderByUserId().asc().list();
for (User user : list) {
System.out.println("user.getDisplayName() = " + user.getDisplayName());
}
}
查询所有的用户,代码如下:
@Test
void test07() {
List<User> list = identityService.createUserQuery().list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
当然还有其他方法,包括排序、分页等。
如果觉得这些方法调用起来费事,那么也可以直接上 SQL,这个底层数据库操作用的 MyBatisPlus,所以这个 SQL 中参数的写法就按照 MyBatisPlus 里边的来即可,代码如下:
@Test
void test08() {
List<User> list = identityService.createNativeUserQuery().sql("select * from ACT_ID_USER where DISPLAY_NAME_ like #{name}").parameter("name", "李%").list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
有的时候,如果不记得表名,也可以按照如下方式现场根据类名查询该类对应的表名,如下:
@Test
void test08() {
List<User> list = identityService.createNativeUserQuery().sql("select * from "+idmManagementService.getTableName(User.class)+" where DISPLAY_NAME_ like #{name}").parameter("name", "李%").list();
for (User user : list) {
System.out.println("user.getId() = " + user.getId());
}
}
下一篇,继续学习springboot +flowable,处理 flowable 的用户和用户组(二)