前文:activiti(一):idea整合spring和avtiviti
目录:activiti 目录
部署流程
- 提供四种部署方法;
- 通过读取资源文件进行部署;png文件和bpmn文件
- 通过 inputstream完成部署
- 通过读取zip文件流进行部署
- 通过读取bytes进行部署
/**
* 获取到部署的总接口
*
* @author caodahuan
* @date 2019/8/28
* @return void
*/
public DeploymentBuilder getBuilder(){
// 1.获取流程引擎实例(如果没有外部扩展,只会有一个默认的流程引擎实例) 这个是保存在一个map里面。
// 如果自定义流程引擎,请构造ProcessEngine,并在里面注册进去。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/*
* 2.这是个流程部署的仓库接口。它处理流程的部署、删除、销毁、查询...等等(门面接口)
* 源代码定义:提供对流程定义和部署存储库的访问的服务。主要涉及表:
* act_ge_bytearray:二进制数据表 png bpmn 存在这个表
* act_re_deployment:部署信息表(id作为act_ge_bytearray的外键)
* act_re_procdef:流程定义数据表
*/
RepositoryService repositoryService = processEngine.getRepositoryService();
/*
* 3.这个是用于部署新流程的构造器(建造者模式);
* 有2类接口方法:
* 第一类:加载资源:
* (1) addInputStream(...):通过流读取流程文件进行部署
* (2) addClasspathResource(String resource):通过读取资源文件进行部署(png和bpmn)
* (3) addZipInputStream(ZipInputStream zipInputStream):通过读取zip文件流进行部署
*
* 第二类:建造中补充参数:
* 设置act_re_deployment表中字段:name、category、key、tenantId等等
*/
DeploymentBuilder deployment = repositoryService.createDeployment();
return deployment;
}
/**
* 第一种部署方法:通过读取资源文件进行部署;png文件和bpmn文件
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void methodOne(){
// 1. 获取到部署新流程的构造器
DeploymentBuilder builder = getBuilder();
// 2. 选择部署方式为:通过资源文件进行部署
builder.addClasspathResource("apply.bpmn");
builder.addClasspathResource("apply.png");
// 3. 设置一些需要的参数(非必须)
builder.key("key"); // 设置key,可重复,可用来启动流程
builder.name("报销流程"); // 设置流程名称
builder.category("3"); // 流程类型
// 4. 部署流程
builder.deploy();
}
/**
* 第二种部署方式:通过 inputstream完成部署
* 一般如果将流程嵌入到本地运营系统中,我们就是使用这种方法,创建文件之后上传到后台进行读取部署。
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void methodTwo() throws Exception{
// 1.获取部署构造器
DeploymentBuilder builder = getBuilder();
// 2.获取部署的资源文件:通过inputstream完成部署
InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.bpmn");
builder.addInputStream("apply.bpmn",inputStream);
// 3. 设置一些需要的参数(非必须)
builder.key("apply_key"); // 设置key,可重复,可用来启动流程
builder.name("报销流程"); // 设置流程名称
// 4. 部署流程
builder.deploy();
}
/**
* 第三种部署方式:通过读取zip文件流进行部署
* 将apply.bpmn和apply.png打成一个zip包
* 一般如果将流程嵌入到本地运营系统中,我们就是使用这种方法,创建文件之后上传到后台进行读取部署。
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void methodThree() throws Exception{
// 1. 获取部署构造器
DeploymentBuilder builder = getBuilder();
// 2.获取部署的资源文件:通过读取zip文件流进行部署
InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
builder.addZipInputStream(zipInputStream);
// 3. 设置一些需要的参数(非必须)
builder.name("请假流程");
builder.key("apply_key");
builder.category("3");
/*
* 4.部署
* 此处不删除第二种方法的部署,我们可以发现,部署同一个流程的结果:
* 在‘流程定义数据表’(act_re_procdef)表中version字段,会有1,2。表示版本已经更新
*/
builder.deploy();
}
/**
* 第四种部署方式:通过读取bytes进行部署
* 允许直接接受byte流
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void methodFour() throws Exception{
// 1. 获取部署构造器
DeploymentBuilder builder = getBuilder();
// 2.获取部署的资源文件:通过读取zip文件流进行部署
InputStream inputStream = new FileInputStream("C:/Users/84604/Desktop/aa/apply.bpmn");
byte[] b = new byte[inputStream.available()];
inputStream.read(b);
builder.addBytes("apply_bpmn",b);
// 3. 设置一些需要的参数(非必须)
builder.name("请假流程");
builder.key("apply_key");
builder.category("3");
/*
* 4.部署
* 此处不删除第二种方法的部署,我们可以发现,部署同一个流程的结果:
* 在‘流程定义数据表’(act_re_procdef)表中version字段,会有1,2。表示版本已经更新
*/
builder.deploy();
}
删除
/**
* 单体删除:直接指定流程部署表的id进行删除
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void deleteTeset(){
// 1.获取流程实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2. 获取到“部署和流程定义”的接口
RepositoryService repositoryService = processEngine.getRepositoryService();
// 3.通过流程部署操作接口进行删除;第一个参数是部署表act_re_deployment中的主键id。后面的true,表示需要关联删除。
repositoryService.deleteDeployment("15001",true);
}
/**
* 一个完整的删除过程;
* 1. 先部署
* 2. 再查询到主键
* 3. 最后根据主键删除
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void deleteWhole(){
// 前置一:获取到流程操作接口和部署的构造器
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService(); // 流程操作接口
DeploymentBuilder builder = repositoryService.createDeployment(); // 流程构造器
// 1. 创建流程
builder.addClasspathResource("apply.bpmn");
builder.addClasspathResource("apply.png");
builder.key("apply_key");
builder.deploy();
// 2. 根据key来查询到流程(也可以根据名称来查询)
DeploymentQuery query = repositoryService.createDeploymentQuery(); // 得到一个查询器
// 因为主键id是随机生成我们无法知道,所以查询时不能查到唯一(key和name都可重复),只能查到列表。所以需要指定排序参数
query.orderByDeploymentId();
query.desc();
query.deploymentKey("apply_key"); // 根据key来查询
List<Deployment> list = query.list();
// 3.删除;根据id删除,所以要获取ID。第一个参数是部署表act_re_deployment中的主键id。后面的true,表示需要关联删除。
if (!CollectionUtils.isEmpty(list)) {
String deploymentId = list.get(0).getId();
repositoryService.deleteDeployment(deploymentId,true);
}
}
打印流程图片
/**
* 打印流程图片
* 1.先创建流程
* 2.查询查询到流程
* 3.得到ID,并根据ID查询出图片,并输出
*
* @author caodahuan
* @date 2019/8/28
* @return void
*/
@Test
public void testQueryPng() throws Exception{
// 前置一:获取到流程操作接口和部署的构造器
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService(); // 流程操作接口
DeploymentBuilder builder = repositoryService.createDeployment(); // 流程构造器
// 1. 创建流程
builder.addClasspathResource("apply.bpmn");
builder.addClasspathResource("apply.png");
builder.key("apply_key");
builder.deploy();
// 2. 根据key来查询到流程(也可以根据名称来查询)
DeploymentQuery query = repositoryService.createDeploymentQuery(); // 得到一个查询器
// 因为主键id是随机生成我们无法知道,所以查询时不能查到唯一(key和name都可重复),只能查到列表。所以需要指定排序参数
query.orderByDeploymentId();
query.desc();
query.deploymentKey("apply_key"); // 根据key来查询
List<Deployment> list = query.list();
// 3. 得到主键,并根据主键和文件名称打印图片!
if (!CollectionUtils.isEmpty(list)) {
String deploymentId = list.get(0).getId();
/**
* deploymentID
* 文件的名称
*/
InputStream inputStream = repositoryService.getResourceAsStream(deploymentId,"apply.png");
OutputStream outputStream3 = new FileOutputStream("C:/Users/84604/Desktop/aa/apply.png");
int b = -1 ;
while ((b=inputStream.read())!=-1){
outputStream3.write(b);
}
inputStream.close();
outputStream3.close();
}
}