Activiti流程定義部署、刪除以及查看流程圖片

方法2:
public void deployZIP() throws Exception {
// 獲取倉庫服務
RepositoryService repositoryService = processEngine.getRepositoryService();
// 創建發佈配置對象
DeploymentBuilder builder = repositoryService.createDeployment();
// 獲得上傳文件的輸入流程
InputStream in = this.getClass().getClassLoader().getResourceAsStream("diagrams/diagrams.zip");
ZipInputStream zipInputStream = new ZipInputStream(in); // 設置發佈信息
builder .name("請假流程")// 添加部署規則的顯示別名 .
addZipInputStream(zipInputStream ); // 完成發佈
builder.deploy(); }
說明:
1)     首先獲得默認的流程引擎,在創建時會自動加載classpath下得activiti.cfg.xml
2)     通過流程引擎獲取了一個RepositoryService對象->倉庫服務對象
3)     由倉庫的服務對象產生一個部署對象配置對象,用來封裝部署環境的相關配置。
4)     這是一個鏈式編程,在部署配置對象中設置顯示名,上傳規則文件相對classpath的地址。
5)     部署,也是往數據庫中存儲流程定義的過程。
6)     這一步在數據庫中將操作三張表:
a)     act_re_deployment
存放流程定義的顯示名和部署時間,每部署一次增加一條記錄
b)     act_re_procdef
存放流程定義的屬性信息,部署每個新的流程定義都會在這張表中增加一條記錄。
c)     act_ge_bytearray
存儲流程定義相關的部署信息。即流程定義文檔的存放地。每部署一次就會增加兩條記錄,一條是關於bpmn規則文件的,一條是圖片的(如果部署時只指定了bpmn一個文件,activiti會在部署時解析bpmn文件內容自動生成流程圖)。兩個文件不是很大,都是以二進制形式存儲在數據庫中。
2、刪除流程
   刪除部署到activiti中的流程定義。
public void delDeployment() throws Exception {
// 獲取倉庫服務對象
RepositoryService repositoryService = processEngine.getRepositoryService();
// 刪除發佈信息
String deploymentId = "1";
// 普通刪除,如果當前規則下有正在執行的流程,則拋異常
repositoryService.deleteDeployment(deploymentId);
// 級聯刪除,會刪除和當前規則相關的所有信息,包括歷史
repositoryService.deleteDeployment(deploymentId, true);
}
說明:
1)     因爲刪除的是流程定義,而流程定義的部署是屬於倉庫服務的,所以應該先得到RepositoryService
2)     如果該流程定義下沒有正在運行的流程,則可以用普通刪除。如果是有關聯的信息,用級聯刪除。一般情況下用普通刪除就可以。由於級聯刪除涉及的數據比較多,一般只開放給超級管理員使用。
3、查看流程定義
/** * 查看流程定義 * 流程定義 ProcessDefinition * id : {key}:{version}:{隨機值} * name : 對應流程文件process節點的name屬性 * key : 對應流程文件process節點的id屬性 * version : 發佈時自動生成的。如果是第一發布的流程,veresion默認從1開始;如果當前流程引擎中已存在相同key的流程,則找到當前key對應的最高版本號,在最高版本號上加1 */public void queryProcessDefinition() throws Exception { // 獲取倉庫服務對象 RepositoryService repositoryService = processEngine.getRepositoryService(); // 獲取流程定義查詢對象 ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery(); // 配置查詢對象 processDefinitionQuery //添加過濾條件// .processDefinitionName(processDefinitionName)// .processDefinitionId(processDefinitionId)// .processDefinitionKey(processDefinitionKey) //分頁條件// .listPage(firstResult, maxResults) //排序條件 .orderByProcessDefinitionVersion().desc(); /** * 執行查詢 * list : 執行後返回一個集合 * singelResult 執行後,首先檢測結果長度是否爲1,如果爲一則返回第一條數據;如果不唯一,拋出異常 * count: 統計符合條件的結果數量 */ List<ProcessDefinition> pds = processDefinitionQuery.list(); // 遍歷集合,查看內容 for (ProcessDefinition pd : pds) { System.out.print("id:" + pd.getId() +","); System.out.print("name:" + pd.getName() +","); System.out.print("key:" + pd.getKey() +","); System.out.println("version:" + pd.getVersion()); } }
說明:
1)     因爲流程定義的信息存放在倉庫中,所以應該獲取RepositoryService。
2)     創建流程定義查詢對象,可以在ProcessDefinitionQuery上設置查詢過濾參數
3)     調用ProcessDefinitionQuery對象的list方法,執行查詢,獲得符合條件的流程定義列表
4)     由運行結果可以看出:
a)     Key和Name的值爲:bpmn文件process節點的id和name的屬性值
b)     key屬性被用來區別不同的流程定義。
c)     帶有特定key的流程定義第一次部署時,version爲1。之後每次部署都會在當前最高版本號上加1
d)     Id的值的生成規則爲:{processDefinitionKey}:{processDefinitionVersion}:{generated-id}, 這裏的generated-id是一個自動生成的唯一的數字
e)     重複部署一次,deploymentId的值以一定的形式變化
f)      流程定義(ProcessDefinition)在數據庫中沒有相應的表對應,只是從act_ge_bytearray表中取出相應的bpmn和png圖片,並進行解析。
4、查看流程圖片
public void viewImage() throws Exception { // 創建倉庫服務對對象 RepositoryService repositoryService = processEngine.getRepositoryService(); // 從倉庫中找需要展示的文件 String deploymentId = "701"; List<String> names = repositoryService.getDeploymentResourceNames(deploymentId); String imageName = null; for (String name : names) { if(name.indexOf(".png")>=0){ imageName = name; } } if(imageName!=null){// System.out.println(imageName); File f = new File("e:/"+ imageName); // 通過部署ID和文件名稱得到文件的輸入流 InputStream in = repositoryService.getResourceAsStream(deploymentId, imageName); FileUtils.copyInputStreamToFile(in, f); }
說明:
1)     deploymentId爲流程部署ID
2)     resourceName爲act_ge_bytearray表中NAME_列的值
3)     使用repositoryService的getDeploymentResourceNames方法可以獲取指定部署下得所有文件的名稱
4)     使用repositoryService的getResourceAsStream方法傳入部署ID和文件名稱可以獲取部署下指定名稱文件的輸入流
5)     最後的有關IO流的操作,使用FileUtils工具的copyInputStreamToFile方法完成流程流程到文件的拷貝
(FileUtils對應的jar:
<dependency>  
       <groupId>commons-fileupload</groupId>  
        <artifactId>commons-fileupload</artifactId>  
        <version>1.3.1</version>  
    </dependency>  )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章