Activity7整合springboot:流程部署,定义,实例(一)
- 前提准备
- 流程部署(Deployment)
- 流程部署定义
- 代码案例
- 流程定义(ProcessDefinition)
- 流程定义
- 案例实现
- 流程实例(ProcessInstance)
- 流程实例定义
- 案例实现
前提准备
1.依赖:
<dependencies>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter</artifactId>
<version>7.1.0.M4</version>
</dependency>
<dependency>
<groupId>org.activiti.dependencies</groupId>
<artifactId>activiti-dependencies</artifactId>
<version>7.1.0.M4</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.13</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.配置文件
注意数据库版本对应,与连接的url后面的参数,同时官方因为有些小bug,需要我们自己写sql修复一下,下载直接在数据库运行即可。
链接:https://pan.baidu.com/s/1s-yDCfA7ijBvMVhsTCHpwA
提取码:7ak3
server:
port: 8090
spring:
application:
name: workflow
datasource:
name: mysqlDatasource
url: jdbc:mysql://localhost:3306/avtivity?useUnicode=true&nullCatalogMeansCurrent=true
username: root
password: 5771323
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# 监控统计拦截的filters,如果启用log4j记得添加依赖
filters: stat,wall
# activiti
activiti:
#每次应用启动不检查Activiti数据表是否存在及版本号是否匹配,提升应用启动速度
database-schema-update: true
#activiti7默认不生成历史信息表,开启历史表
db-history-used: true
#在项目单独作为一个引擎,本身不部署流程的时候,如果resources目录没有“processes”目录,启动项目报错–找不到processes目录。需要在配置文件中添加以下内容:
check-process-definitions: false
process-definition-location-prefix: classpath:/processes/
process-definition-location-suffixes:
-**.bpmn
-**.bpmn20.xml
#保存历史数据级别设置为full最高级别,便于历史数据的追溯
history-level: full
# activiti 安全访问
security:
basic:
enabled: true
user:
name: root
password: root
运行后数据库会自动创建25条表。
流程部署(Deployment)
流程部署定义
1. 部署流程就是创建bpmn图,或者导入业务流程图,通过部署代码运行到数据库中并保存起来,说白了就是搭起一个框架,到时候就按照这个流程运行。
2. 因为只牵扯到部署,所以需要通过注入一个类,***RepositoryService*** ,通过这个类可以部署流程,并且后面还可以获取流程的相关信息
代码案例
@Autowired
private RepositoryService repositoryService;
/**
* 通过bpmn部署流程
*/
@Test
public void initDeploymentBPMN(){
String filename = "processes/test.bpmn20.xml";
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource(filename)
.name("测试任务部署test1")
.deploy();
System.out.println(deployment.getName());
}
/**
* 获取部署流程信息
*/
@Test
public void getDeploymentInfo(){
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for (Deployment deployment : list) {
System.out.println(deployment.getId());
System.out.println(deployment.getName());
System.out.println(deployment.getDeploymentTime());
}
}
3.运行后数据会保存到如图表中
act_ge_bytearray:保存业务图,或bpmn文件
act_re_deployment:保存流程的基本信息等
流程定义(ProcessDefinition)
流程定义
1.流程定义就是获取流程部署成功后的基本信息
2. 因为都是与部署相关,所以操作的类也是 ***RepositoryService***。
案例实现
@Autowired
private RepositoryService repositoryService;
/**
* 查询流程定义
*/
@Test
public void getDefinition(){
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition p: list){
System.out.println(p.getName());
}
}
/**
* 删除流程定义
*/
@Test
public void delDefinition(){
String ppID = "";
//第二个参数为true就是全部删除记录,false保留历史数据
repositoryService.deleteDeployment(ppID,false);
System.out.println("删除流程定义完成");
}
因为是查询数据,所以也不会创建表信息
流程实例(ProcessInstance)
流程实例定义
1.如果流程定义好比一个类,流程定义就好比这个类的对象,因此也是一对多的关系。
2.同时流程实例可以挂起也可以激活
3.因为是运行时的操作,所以操作类也改变了,***runtimeService***
4.保存的数据库为: act_re_procdef
案例实现
//实例是运行状态,所以用这个类来操作
@Autowired
private RuntimeService runtimeService;
/**
* 初始化流程实例
*/
@Test
public void initProcessInstance(){
//TODO 获取页面表单的数据,例如请假时间,原因等,然后将这些信息自己创建一个业务表
//TODO 第二个参数将来就存放这个业务表的id,这样就工作流和业务关联起来了
//TODO 第一个参数为bpmn的id
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("bpmn的id","bket01");
}
/**
* 获取流程实例列表
*/
@Test
public void getProcessInstances(){
List<ProcessInstance> processInstanceQuery = runtimeService.createProcessInstanceQuery().list();
for (ProcessInstance processInstance : processInstanceQuery) {
//输出流程实例的信息
System.out.println(processInstance.getName());
System.out.println(processInstance.getBusinessKey());
System.out.println(processInstance.getId());
//查看流程是否结束
System.out.println(processInstance.isEnded());
//查看流程是否挂起
System.out.println(processInstance.isSuspended());
}
}
/**
* 暂停与激活流程实例
*/
@Test
public void activiteProcessInstance(){
//挂起流程实例
runtimeService.suspendProcessInstanceById("流程实例id");
//激活流程
runtimeService.activateProcessInstanceById("流程id");
}
/**
* 删除流程实例
*/
@Test
public void delProcessInstance(){
//第二个参数为删除理由,如果流程id已经删除了,在删除会报错
runtimeService.deleteProcessInstance("流程id","删着玩");
System.out.println("删除流程实例");
}
需要注意的是:为了使工作流与咱们的业务挂钩,所以在流程实例创建的时候咱们可以创建咱们的业务表返回id与实例相关联,例如: runtimeService.startProcessInstanceByKey("bpmn的id","bket01");
第一个参数为bpmn流程图的id,第二个参数就是咱们挂钩业务表的id,这样数据库也会相关联了。当然还有其他的到时候补充。