1. 程式人生 > 程式設計 >第四節:Activiti6.0——釋出相關的API使用

第四節:Activiti6.0——釋出相關的API使用

一、釋出資源

說明:從儲存服務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資源的釋出與讀取。 ① 釋出壓縮檔案

  1. 新增壓縮檔案到resource目錄下(該壓縮檔案只包含兩個txt檔案):
    壓縮檔案
  2. 編碼進行釋出
//獲取流程引擎
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(不使用檔案,程式碼生成)
  1. 編碼如下:
 	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;
    }
複製程式碼
  1. 檢視
    bpmn

二、activiti對bpmn檔案的驗證

概述:在釋出bpmn檔案時,activiti會對檔案的標籤和邏輯進行驗證,如果驗證不通過則會丟擲異常。

  1. 標籤不正確的驗證
  • 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();
複製程式碼
  1. 邏輯不正確的驗證
  • bpmn圖如下:
    bpmn圖
  • 報錯如下:
    報錯
  • 關閉邏輯驗證:
//關閉對bpmn邏輯的驗證
deployment.disableBpmnValidation();
複製程式碼

三、查詢部署的資源

概述:當我們釋出成功後,可以對釋出的資源進行查詢。

  1. 查詢文字資源
//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
複製程式碼
  1. 查詢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();
複製程式碼

檢檢視片:

路徑
bpmn圖

四、刪除部署檔案

刪除部署資料: 1. 不管是否指定級聯,都會刪除部署相關的身份資料、流程定義資料、流程資源與部署資料 2. 如果設定為級聯刪除,則會將執行的流程例項、流程任務以及流程例項的歷史資料刪除 3. 如果不級聯刪除,但是存在執行時資料,例如還有流程例項,就會刪除失敗

五、過濾重複部署

  • 當進行第一次部署後,資源沒有發生變化而再次進行部署的話,同樣會將部署資料寫入到資料庫中。如果想避免這種情況,可以呼叫DeploymentBuilder的enableDuplicateFiltering方法。
  • 在執行deploy方法時,如果發現該值為true,則根據部署物件的名稱去查詢最後一條部署記錄,如果發現最後一條部署記錄與當前需要部署的記錄一致,則不會重複部署。(此處的記錄一致,是指DeploymentEntity下的資源是否相同,包括==資源名稱和資源內容==)