前文: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();
}
}