學習資料:《Activiti實戰》
第五章 用戶與組及部署管理(二)部署流程資源
內容概覽:講解流程資源的讀取與部署。
5.2 部署流程資源
5.2.1 流程資源
流程資源常用的有以下幾種:
1 流程定義文件:拓展名為bpmn20.xml和bpmn 2 流程定義的圖片:拓展名為PNG 3 表單文件:拓展名為form 4 規則文件:拓展名為drl
部署流程資源的時候,要注意一點:
引擎會根據不同的拓展名進行不同的處理。bpmn或bpmn20.xml類型的文件,會在ACT_RU_PROCDEF(流程定義表)、ACT_GE_BYTEARRAY(字節流表)兩個表中都插入一條數據。而png類型的文件,只會在ACT_GE_BYTEARRAY表中插入一條數據。
所以可以看到,下文中所有部署,assertEquals(int,processDefinitionQuery)中的int都沒有包含png的數目在內。
5.2.2 部署流程資源
啟動一個流程實例processInstance,需要首先部署流程定義processDefinition,流程定義由許多活動Activity組成。
部署流程定義的方法有很多種,包括:
1 classpath方式:addClasspathResource() 2 InputStream方式:addInputStream() 3 字符串方式:addString() 4 zip/bar方式:addZipInputStream()
(1)classpath方式
一般用在測試環節,真實的產品環境中很少用到這種方式。一般是管理頁面手動部署或者設計完流程后直接部署到engine中。
項目中資源文件存放的位置:
示例代碼(為了方便說明,沒有使用鏈式編程,而是把每一步都分開寫了):
1 public class ClasspathDeploymentTest extends AbstractTest{ 2 @Test 3 public void testClasspathDeployment throws Exception(){ 4 String bpmnClasspath = "chapter5/candidateUserInUserTask.bpmn"; 5 String pngClasspath = "chapter5/candidateUserInUserTask.bng"; 6 7 DeploymentBuilder db = repositoryService.createDeployment(); 8 db.addClasspathResource(bpmnClasspath); 9 db.addClasspathResource(pngClasspath); 10 db.deploy(); 11 12 //驗證部署是否成功 13 ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery(); 14 long count = pdq.processDefinitionKey("candidateUserInUserTask").count; 15 assertEquals(1,count); 16 17 //讀取圖片文件 18 ProcessDefinition pd = ProcessDefinitionQuery.singleResult(); 19 String diagramResourceName = pd.getDiagramResourceName(); 20 assertEquals(pngClasspath,diagramResourceName); 21 } 22 }
(2)InputStream方式
InputStream方式在產品環境中用的比較多,比如從web客戶端接受一個文件對象,或者從URL中獲取文件流,最后部署到engine中。
InputStream方式需要傳入一個輸入流及資源的名稱。輸入流的來源不限,可以是絕對路徑,可以是classpath,可以是網絡獲取。
(從絕對路徑獲取)示例代碼:
1 public class InputStreamDeploymentTest extends AbstractTest{ 2 @Test 3 public void testInputStreamFromAbsoluteFilePath() throws Exception{ 4 String filePath = "/Users/henryyan/work/books/aia-books/aia-codes/bpmn20-example/src/test/ 5 resources/chapter5/userAndGroupInUserTask.bpmn"; 6 7 FileInputStream fis = new FileInputStream(filePath); 8 repositoryService.createDeployment() 9 .addInputStream("userAndGroupInUserTask.bpmn",fis) 10 .deploy();//用userAndGroupInUserTask.bpmn作為資源名稱 11 12 //驗證部署是否成功 13 ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery(); 14 long count = pdq.processDefinitionKey("userAndGroupInUserTask").count; 15 assertEquals(1,count); 16 } 17 }
(3)字符串方式
字符串方式是直接傳入純文本作為資源的來源。
示例代碼:
1 public class StringDeploymentTest extends AbstractTest{ 2 //完整的text內容略 3 private String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>"; 4 5 @Test 6 public void testCharsDeployment(){//用candidateUserInUserTask.bpmn作為資源名稱 7 repositoryService.createDeployment().addString("candidateUserInUserTask.bpmn",text).deploy(); 8 9 //驗證部署是否成功 10 ProcessDefinitionQuery pdq = repositoryService.createProcessDefinitionQuery(); 11 long count = pdq.processDefinitionKey("candidateUserInUserTask").count; 12 assertEquals(1,count); 13 } 14 }
(4)zip/bar格式壓縮包方式
前面三種方式一次都只能部署一個資源。除非執行多次deployment.addXXX()方法。
zip/bar方式,允許用戶將資源打包,一次性部署多個資源。這幾個資源關聯的部署ID相同,因為屬於同一次部署。
將文件打包為bar或者zip均可:
示例代碼:
這里的addZipInputStream()相當於for循環了n次addInputStream()。
且這四個資源關聯的是同一個deploymentID。
1 public class ZipStreamDeploymentTest extends AbstractTest{ 2 @Test 3 public class testZipStreamFromAbsoluteFilePath(){ 4 InputStream zipStream = getClass().getClassLoader().getResourceAsStream("chapter5/chapter5-deployment.bar"); 7 repositoryService.createDeployment().addZipInputStream(new ZipInputStream(zipStream)).deploy(); 10 11 //驗證部署是否成功 12 long count = repositoryService.createProcessDefinitionQuery().count(); 13 assertEquals(2,count);//注意,不是4!!! 14 15 //查詢部署記錄 16 Deployment deployment = repositoryService.createDeploymentQuery().singleResult(); 17 assertNotNull(deployment); 18 19 //驗證四個文件均部署成功,且屬於同一個部署ID 20 String deploymentID = deployment.getId(); 21 assertNotNull(repositoryService.getResourceAsStream(deploymentID,"candidateUserInUserTask.bpmn")); 22 assertNotNull(repositoryService.getResourceAsStream(deploymentID,"candidateUserInUserTask.png")); 23 assertNotNull(repositoryService.getResourceAsStream(deploymentID,"userAndGroupInUserTask.bpmn")); 24 assertNotNull(repositoryService.getResourceAsStream(deploymentID,"userAndGroupInUserTask.png")); 25 } 26 }