基本流程讲解与开发前奏
核心API介绍
springboot环境下不再以activiti.cfg.xml文件的形式配置,可在yml内配置,yml配置会在后文讲解。
RepositoryService:对流程定义进行管理。
RuntimeService:对流程实例的管理。
TaskService:对流程任务进行管理。
IdentityService:管理用户和用户组。
ManagementService:提供对activiti数据库的直接访问【一般不用】。
HistoryService:对流程的历史数据进行操作。
FormService:动态表单。
Activiti6 YML配置
1.加入配置
spring:
activiti:
database-schema-update: false
check-process-definitions: false
activiti使用starter配置后属于spring下。
check-process-definitions【检查Activiti数据表是否存在及版本号是否匹配】默认为true,自动创建好表之后设为false。设为false会取消自动部署功能。
database-schema-update【在流程引擎启动和关闭时处理数据库模式】如下(摘自官网)
- false (默认值):在创建流程引擎时检查库模式的版本,如果版本不匹配则抛出异常。
- true:在创建流程引擎时,执行检查并在必要时对数据库中所有的表进行更新,如果表不存在,则自动创建。
- create-drop:在创建流程引擎时,会创建数据库的表,并在关闭流程引擎时删除数据库的表。
准备步骤
1.测试项目结构:主要为做工作流部署的两种形式,zip为bpmn与png文件的压缩文件
2.安装eclipse activiti插件
https://www.cnblogs.com/mingforyou/p/5347561.html【百度找了一个老哥的,这个就你们自己去倒腾了。难度不大】
3.流程图如下
代码后续用到功能时会贴出
RepositoryService
打开测试类
部署流程定义
/**部署流程定义*/
@Test
public void deploy(){
Deployment deployment = repositoryService.createDeployment()//创建一个部署对象
.name("helloworld入门程序")
.addClasspathResource("bpmn/MyProcess.bpmn")//从classpath的资源中加载,一次只能加载一个文件
.addClasspathResource("bpmn/MyProcess.png")
.deploy();
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
}
部署过程同时会影响三张表的数据
ACT_RE_DEPLOYMENT(第二行)
ACT_GE_BYTEARRAY(文件会被存在这张表内,activiti以纵表方式存储数据)
ACT_RE_PROCDEF
部署流程定义(zip)
/**部署流程定义(zip) */
@Test
public void deployzip() throws IOException{
InputStream in = this.getClass().getClassLoader().getResourceAsStream("bpmn/MyProcess.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = repositoryService.createDeployment()
.name("helloworld入门程序2")
.addZipInputStream(zipInputStream)//指定zip格式的文件完成部署
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署名称:"+deployment.getName());
zipInputStream.close();
}
【PS:流程实例可以重复部署,有版本号作为标识】
删除流程定义
/**删除流程定义*/
@Test
public void deleteProcess(){
String deploymentId = "25001";
/**不带级联的删除:只能删除没有启动的流程,如果流程启动,就会抛出异常*/
// repositoryService.deleteDeployment(deploymentId);
/**级联删除:不管流程是否启动,都能可以删除(emmm大概是一锅端)*/
repositoryService.deleteDeployment(deploymentId, true);
System.out.println("删除成功!");
}
RuntimeService
【多个流程实例之间不会相互影响】
注入Service
启动流程实例
/**启动流程实例*/
@Test
public void startProcessInstance(){
//流程定义的key
String processDefinitionKey = "myProcess";
//key对应MyProcess.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefinitionKey);
System.out.println("流程实例ID:"+pi.getId());//流程实例ID
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID
}
查询流程实例
/**查询流程实例*/
@Test
public void searchProcessInstance(){
String processDefinitionKey = "myProcess";
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
System.out.println("流程实例ID:"+pi.getId());
System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
}
流程实例的删除
/**流程实例的删除*/
@Test
public void deleteProcessInstanceTest(){
String processDefinitionKey = "myProcess";
ProcessInstance pi = runtimeService.createProcessInstanceQuery()
.processDefinitionKey(processDefinitionKey)
.singleResult();
String processInstanceId = pi.getProcessInstanceId();
System.out.println("流程实例ID:"+pi.getId());
runtimeService.deleteProcessInstance(processInstanceId,"删除测试");
}