2017.2.28 activiti實戰--第五章--用戶與組及部署管理(二)部署流程資源


學習資料:《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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM