1、部署流程定義
部署流程定義也可以認為是增加流程定義。
首先創建流程引擎對象(公用的方法)
/** * 1.發布流程 * 會在三張表中產生數據: * act_ge_bytearray 產生兩條數據 * act_re_deployment 產生一條數據 * act_re_procdef 產生一條數據 */ public void deploy() throws Exception { // 獲取倉庫服務 RepositoryService repositoryService = processEngine.getRepositoryService(); // 創建發布配置對象 DeploymentBuilder builder = repositoryService.createDeployment(); // 設置發布信息 builder .name("請假流程")// 添加部署規則的顯示別名 .addClasspathResource("diagrams/Leave2.bpmn")// 添加規則文件 .addClasspathResource("diagrams/Leave2.png");// 添加規則圖片 不添加會自動產生一個圖片不推薦 // 完成發布 builder.deploy(); }
方法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圖片,並進行解析。