文章目录
- 1. 搭建环境
- 1.1 引入POM
- 1.2 添加yml配置文件
- 1.3 启动类
- 1.4 创建流程定义文件目录
- 2. 测试环境-生成数据表
- 2.1 创建流程图
- 2.2 创建测试类
- 2.3 测试-生成数据表
- 3. 在Activiti中集成JPA
- 3.1 为何集成JPA
- 3.2 如何集成JPA
- 4. 实例分析-测试
- 4.1 生成实体类,dao,service,Controller
- 4.2 启动流程
- 4.3 查询及完成任务
- 4.4 创建xml文件用于存放自定义sql语句
- 4.5 测试自定义JPA查询
1. 搭建环境
注意:本环境使用Activiti6.0.0,无需配置config文件,启动部署流程会自动创建表
1.1 引入POM
<!--1 确定spring boot的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<!--test测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
<!--web起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--MySQL数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--jpa-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.1.4.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<!--activiti6-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>6.0.0</version>
</dependency>
</dependencies>
1.2 添加yml配置文件
#端口号
server:
port: 9090
#服务名和数据源(连接池)
spring:
application:
name: activitiservice
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/activiti6_jpa?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&nullCatalogMeansCurrent=true
username: root
password: 1234
jpa:
show-sql: true
activiti:
check-process-definitions: false #是否自动检查、部署流程定义文件
database-schema-update: true #自动更新数据库结构
#流程定义文件存放目录
process-definition-location-prefix: classpath:/processes/
#process-definition-location-suffixes: #流程文件格式
history-level: full
1.3 启动类
注意:启动类上必须添加(exclude = SecurityAutoConfiguration.class),否则报错
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class StudyActivitiJpaApplication {
public static void main(String[] args) {
SpringApplication.run(StudyActivitiJpaApplication.class,args);
}
}
1.4 创建流程定义文件目录
在resources下创建包processes,用来存放流程定义文件
2. 测试环境-生成数据表
2.1 创建流程图
这里暂且使用IDEA插件activBpm进行画图 需要下载插件activBpm
下载完插件重启IDEA即可使用。
设计流程图:
processes
在创建完流程图后,需要手动复制bpmn文件,粘贴修改为xml文件,为了生成png图片
2.2 创建测试类
在test测试区创建测试类ActivitiJpaTest01进行环境的初步测试
2.3 测试-生成数据表
ActivitiJpaTest01:
package com.yb;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* @author liangjie@itcast.cn
* @version 1.0
* @date 2020/8/5
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ActivitiJpaTest01 {
@Resource
private RepositoryService repositoryService;
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private HistoryService historyService;
/**
* 部署流程
*/
@Test
public void demo01(){
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("processes/avtiviti_demo01.bpmn")
.addClasspathResource("processes/avtiviti_demo01.png")
.name("整合JPA测试01")
.deploy();
System.out.println("部署ID:"+deploy.getId());
System.out.println("部署名称"+deploy.getName());
}
}
控制台:
数据库:
测试成功,初步环境无误,数据库生成28张表。
想知道各个表的意义,请参考该文章5.1
3. 在Activiti中集成JPA
解决动态表单生成的大量数据
3.1 为何集成JPA
如果选择了使用动态表单那么将面临一个比较“严峻”的问题——大数据量,我们知道动态表单的内容都保存在一张表中(ACT_HI_DETAIL),我们也清楚动态表单中每一个Field都会在该表中插入一条记录,假如一个流程共有20个字段,这个数据量大家可以计算一下,每天多少个流程实例,每个月、每年多少?
日积月累的大数据会影响系统的性能,尤其涉及到关联查询时影响更深,除了性能之外动态表单还有一个弊端那就是数据是以行的形式存储没有任何数据结构可言,流程运行中生成的数据很难被用于分析、查询,如何破解呢?
3.2 如何集成JPA
Activiti除了核心的Engine之外对企业现有的技术、平台、架构都有所支持,对于业务实体的持久化当然也会有所支持,那就是EJB的标准之一 ——JPA,引擎把JPA的API引入到了内部,使用JPA功能的时候只需要在接口中继承JpaRepository即可。JPA的基础使用可参考1JPA的基础使用可参考2JPA的基础使用可参考3
4. 实例分析-测试
4.1 生成实体类,dao,service,Controller
4.2 启动流程
/**
* 发布流程
*/
@Test
public void runtimeRelease(){
ProcessInstance pi = runtimeService.startProcessInstanceByKey("demo01");
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
}
4.3 查询及完成任务
/**
* 查询及完成任务
*/
@Test
public void taskQueryComplete(){
List<Task> list = taskService.createTaskQuery()
.taskAssignee("user2")
.list();
for (Task task : list) {
System.out.println("--------------------------------------------");
System.out.println("任务ID:" + task.getId());
System.out.println("任务名称:" + task.getName());
System.out.println("任务创建时间:" + task.getCreateTime());
System.out.println("任务委派人:" + task.getAssignee());
System.out.println("流程实例ID:" + task.getProcessInstanceId());
//完成任务
taskService.complete(task.getId());
}
}
4.4 创建xml文件用于存放自定义sql语句
<?xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_0.xsd"
version="2.1">
<named-query name="ActHiTaskinst.findByIdAndName">
<query>
<![CDATA[
select u from ActHiTaskinst u
where u.ID_=?1 and u.NAME_=?2
]]>
</query>
</named-query>
</entity-mappings>
4.5 测试自定义JPA查询
dao
@Query(name = "ActHiTaskinst.findByIdAndName")
ActHiTaskinst findByIdAndName(String id,String name);
orm.xml
<named-query name="ActHiTaskinst.findByIdAndName">
<query>
<![CDATA[
select u from ActHiTaskinst u
where u.ID_=?1 and u.NAME_=?2
]]>
</query>
</named-query>
测试类:
/*注入Dao*/
@Resource
private ActHiTaskinstDao actHiTaskinstDao;
/**
* 测试自定义JPA查询
*/
@Test
public void testJpa01(){
ActHiTaskinst idAndName = actHiTaskinstDao.findByIdAndName("2505", "请假申请");
System.out.println(idAndName);
}