第四節:Activiti6.0——釋出相關的API使用
阿新 • • 發佈:2020-06-24
一、釋出資源
說明:從儲存服務RepositoryService可以獲取釋出生成器DeploymentBuilder,該生成器中可以呼叫新增資源的方法,有不同資源的新增,然後呼叫deploy()方法進行釋出。具體的新增方法如下:
DeploymentBuilder addInputStream(String resourceName,InputStream inputStream);
DeploymentBuilder addClasspathResource(String resource);
DeploymentBuilder addString(String resourceName,String text) ;
DeploymentBuilder addBytes(String resourceName,byte[] bytes);
//zip壓縮檔案
DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);
//bpmn檔案
DeploymentBuilder addBpmnModel(String resourceName,BpmnModel bpmnModel);
複製程式碼
此處只測試壓縮檔案和bpmn資源的釋出與讀取。 ① 釋出壓縮檔案
- 新增壓縮檔案到resource目錄下(該壓縮檔案只包含兩個txt檔案):
- 編碼進行釋出
//獲取流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//獲取儲存服務
RepositoryService repositoryService = processEngine.getRepositoryService();
//獲取壓縮檔案流
FileInputStream fileInputStream = new FileInputStream(new File("resource/datas.zip"));
ZipInputStream zipInputStream = new ZipInputStream(fileInputStream);
//獲取釋出生成器
DeploymentBuilder deployment = repositoryService.createDeployment();
//新增壓縮檔案流
deployment.addZipInputStream(zipInputStream);
//釋出
deployment.deploy();
//關閉
processEngine.close();
System.exit(0);
複製程式碼
3.檢視:
- 在act_re_deployment表中檢視釋出資料:
- 在act_ge_bytearray表檢視具體的資源資料: ②釋出bmpn(不使用檔案,程式碼生成)
- 編碼如下:
public static void main(String[] args) {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.addBpmnModel("myProcess",createBpmnModel());
deployment.deploy();
processEngine.close();
System.exit(0);
}
/**
* 獲取BPMN模型物件,跟使用bpmn檔案和xml檔案是一樣的
* @return
*/
private static BpmnModel createBpmnModel(){
//建立BPMN模型物件
BpmnModel bpmnModel = new BpmnModel();
//建立一個流程定義
Process process = new Process();
bpmnModel.addProcess(process);
process.setId("myProcess");
process.setName("My Process");
//開始事件
StartEvent startEvent = new StartEvent();
startEvent.setId("startEvent");
process.addFlowElement(startEvent);
//使用者事件
UserTask userTask = new UserTask();
userTask.setId("userTask");
userTask.setName("User Task");
process.addFlowElement(userTask);
//結束事件
EndEvent endEvent = new EndEvent();
endEvent.setId("endEvent");
process.addFlowElement(endEvent);
//新增流程順序
process.addFlowElement(new SequenceFlow("startEvent","userTask"));
process.addFlowElement(new SequenceFlow("userTask","endEvent"));
return bpmnModel;
}
複製程式碼
- 檢視
二、activiti對bpmn檔案的驗證
概述:在釋出bpmn檔案時,activiti會對檔案的標籤和邏輯進行驗證,如果驗證不通過則會丟擲異常。
- 標籤不正確的驗證
- xml如下圖;
- 報錯
Exception in thread "main" org.activiti.bpmn.exceptions.XMLException: cvc-complex-type.2.4.a: 發現了以元素 'abc' 開頭的無效內容。
複製程式碼
- 取消驗證標籤屬性
DeploymentBuilder deployment = repositoryService.createDeployment();
deployment.addClasspathResource("my_process.bpmn");
//去掉標籤結構驗證
deployment.disableSchemaValidation();
複製程式碼
- 邏輯不正確的驗證
- bpmn圖如下:
- 報錯如下:
- 關閉邏輯驗證:
//關閉對bpmn邏輯的驗證
deployment.disableBpmnValidation();
複製程式碼
三、查詢部署的資源
概述:當我們釋出成功後,可以對釋出的資源進行查詢。
- 查詢文字資源
//1.首先發布文字資源
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addClasspathResource("my_text.txt");
Deployment deployment = deploymentBuilder.deploy();
//讀取文字資源
InputStream resourceAsStream = repositoryService.getResourceAsStream(deployment.getId(),"my_text.txt");
int count = resourceAsStream.available();
byte[] bytes = new byte[count];
resourceAsStream.read(bytes);
String text = new String(bytes);
System.out.println(text);
//結果:this is xjf's text
複製程式碼
- 查詢bpmn的xml資源
DeploymentBuilder builder = repositoryService.createDeployment();
builder.addClasspathResource("query.bpmn");
Deployment deployment = builder.deploy();
//讀取xml檔案
System.out.println("depoyment的id:" + deployment.getId());
//獲取流程定義
ProcessDefinition processDefinition = repositoryService
.createProcessDefinitionQuery()
.deploymentId(deployment.getId())
.singleResult();
System.out.println("processDefinition的id:" + processDefinition.getId());
//獲取資源的輸入流
InputStream processModel = repositoryService.getProcessModel(processDefinition.getId());
int count = processModel.available();
byte[] bytes = new byte[count];
processModel.read(bytes);
String xml = new String(bytes);
System.out.println(xml);
複製程式碼
結果:
3. 查詢bpmn的圖片資源:Deployment deployment = repositoryService.createDeployment().addClasspathResource("query.bpmn").deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//讀取流程資源圖片
InputStream inputStream = repositoryService.getProcessDiagram(processDefinition.getId());
BufferedImage image = ImageIO.read(inputStream);
System.out.println("圖片:" + image);
//儲存為圖片檔案
File file = new File("resource/image/result.png");
if (!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(image,"png",fos);
fos.close();
inputStream.close();
複製程式碼
檢檢視片:
四、刪除部署檔案
刪除部署資料: 1. 不管是否指定級聯,都會刪除部署相關的身份資料、流程定義資料、流程資源與部署資料 2. 如果設定為級聯刪除,則會將執行的流程例項、流程任務以及流程例項的歷史資料刪除 3. 如果不級聯刪除,但是存在執行時資料,例如還有流程例項,就會刪除失敗
五、過濾重複部署
- 當進行第一次部署後,資源沒有發生變化而再次進行部署的話,同樣會將部署資料寫入到資料庫中。如果想避免這種情況,可以呼叫DeploymentBuilder的enableDuplicateFiltering方法。
- 在執行deploy方法時,如果發現該值為true,則根據部署物件的名稱去查詢最後一條部署記錄,如果發現最後一條部署記錄與當前需要部署的記錄一致,則不會重複部署。(此處的記錄一致,是指DeploymentEntity下的資源是否相同,包括==資源名稱和資源內容==)