JPBM(四)管理流程定義

概念:

ProcessDefinition,流程定義:一個流程的步驟說明,如一個請假流程、報銷流程、是一個規則。

ProcessDefinition,流程定義對象,是解析.jpdl.xml文件得到流程步驟的信息。沒有更新操作,啓動流程實例時是使用指定key的最新的版本。

 

1.部署流程定義

a)一次添加一個資源,相關文件在Classpath

[java] view plain copy
  1. // 1,部署流程定義(添加)  
  2.     // jbpm4_deployment  
  3.     // jbpm4_deployprop  
  4.     // jbpm4_lob  
  5.     @Test  
  6.     public void deploy_1() {  
  7.         String deploymentId = processEngine.getRepositoryService()//  
  8.                 .createDeployment()//創建一個部署對象,Deployment:一次部署的信息,含有多個文件  
  9.                 .addResourceFromClasspath("helloworld/test.jpdl.xml")//往Deployment對象添加資源  
  10.                 .addResourceFromClasspath("helloworld/test.png")//  
  11.                 .deploy();//執行部署  
  12.         System.out.println("deploymentId = " + deploymentId);  
  13.     }  

b)一次添加多個資源,多個資源先打成zip

[java] view plain copy
  1. @Test  
  2.     public void deploy_2() {  
  3.         // 找到zip文件  
  4.         InputStream in = this.getClass().getClassLoader().getResourceAsStream("helloworld/helloworld.zip");  
  5.         ZipInputStream zipInputStream = new ZipInputStream(in);  
  6.   
  7.         // 部署  
  8.         String deploymentId = processEngine.getRepositoryService()//  
  9.                 .createDeployment()//  
  10.                 .addResourcesFromZipInputStream(zipInputStream)//  
  11.                 .deploy();  
  12.         System.out.println("deploymentId = " + deploymentId);  
  13.     }  

c)說明

1, addResourceFromClasspath(resource); 可以調用多次以添加多個文件。文件重複添加也不會報錯。

2, addResourceFromInputStream(resourceName, inputStream)添加一個文件(使用InputStream

3, addResourcesFromZipInputStream(zipInputStream)添加多個文件,裏面也可以有文件夾。

4, 以上方法可以在一起調用。

2.查詢所有流程定義

a) 查詢所有流程定義

[java] view plain copy
  1. @Test  
  2.     public void findAll() {  
  3.         // 查詢  
  4.         List<ProcessDefinition> list = processEngine.getRepositoryService()//  
  5.                 .createProcessDefinitionQuery()//  
  6.                 .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//排序條件  
  7.                 //.count()查詢出總數量  
  8.                 //.page(0, 100)分頁,取出前100條記錄  
  9.                 .list();  
  10.   
  11.         // 顯示  
  12.         for (ProcessDefinition pd : list) {  
  13.             System.out.println("id=" + pd.getId()// 格式爲:{key}-{version}  
  14.                     + ", name=" + pd.getName()// 流程定義文件(.jpdl.xml)中根元素的name屬性的值  
  15.                     + ", key=" + pd.getKey()// 流程定義文件(.jpdl.xml)中根元素的key屬性的值,可以不寫,不寫就是name屬性的值  
  16.                     + ", version=" + pd.getVersion()// 流程定義文件(.jpdl.xml)中根元素的version屬性的值,可以不寫,不寫就會自增(key相同時,版本加1)  
  17.                     + ", deploymentId=" + pd.getDeploymentId()); // 本流程定義對應的 .jpdl.xml 文件所屬的Deployment對象的id  
  18.         }  
  19.     }  

b) 查詢所有最新版本的流程定義

[java] view plain copy
  1. @Test  
  2.     public void findAllLatestVersions() {  
  3.         // 1,查詢所有流程定義,按Version升序排列,這樣所有最大的版本就都排到最後了  
  4.         List<ProcessDefinition> allList = processEngine.getRepositoryService()//  
  5.                 .createProcessDefinitionQuery()//  
  6.                 .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//  
  7.                 // .processDefinitionName("test")//  
  8.                 // .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//  
  9.                 // .orderDesc(ProcessDefinitionQuery.PROPERTY_KEY)//  
  10.                 // .uniqueResult()  
  11.                 // .count()  
  12.                 // .page(firstResult, maxResults)  
  13.                 .list();  
  14.   
  15.         // 2,過濾出所需的最新版本的流程定義  
  16.         Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();  
  17.         for (ProcessDefinition pd : allList) {  
  18.             map.put(pd.getKey(), pd);//不同的key會保存最新的版本(上面已經按版本升序排列)  
  19.         }  
  20.   
  21.         // 顯示  
  22.         for (ProcessDefinition pd : map.values()) {  
  23.             System.out.println("id=" + pd.getId()// 格式爲:{key}-{version}  
  24.                     + ", name=" + pd.getName()// 流程定義文件(.jpdl.xml)中根元素的name屬性的值  
  25.                     + ", key=" + pd.getKey()// 流程定義文件(.jpdl.xml)中根元素的key屬性的值,可以不寫,不寫就是name屬性的值  
  26.                     + ", version=" + pd.getVersion()// 流程定義文件(.jpdl.xml)中根元素的version屬性的值,可以不寫,不寫就會自增(key相同時,版本加1)  
  27.                     + ", deploymentId=" + pd.getDeploymentId()); // 本流程定義對應的 .jpdl.xml 文件所屬的Deployment對象的id  
  28.         }  
  29.     }  

3.刪除流程定義(其實是刪除Deployment)

a) 刪除某個Deployment

[java] view plain copy
  1. @Test  
  2.     public void deleteById() {  
  3.         String deploymentId = "1";  
  4.         // // 刪除某Deployment,如果有關聯的執行信息,就拋異常  
  5.         // processEngine.getRepositoryService().deleteDeployment(deploymentId);  
  6.         // 刪除某Deployment,如果有關聯的執行信息,就級聯刪除  
  7.         processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);  
  8.     }  

b) 刪除指定key的所有版本的流程定義

[java] view plain copy
  1. @Test  
  2.     public void deleteByKey() {  
  3.         // 1,查詢出指定key的所有版本的流程定義  
  4.         List<ProcessDefinition> list = processEngine.getRepositoryService()//  
  5.                 .createProcessDefinitionQuery()//  
  6.                 .processDefinitionKey("helloworld")//  
  7.                 .list();  
  8.   
  9.         // 2,循環刪除  
  10.         for (ProcessDefinition pd : list) {  
  11.             processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());  
  12.         }  
  13.     }  

4.獲取部署時的某文件的資源(查看流程圖)

a) 查看流程圖

[java] view plain copy
  1. @Test  
  2.     public void getResourceFromDeployment() throws Exception {  
  3.         String deploymentId = "50001";  
  4.         String resourceName = "helloworld/test.png"// 指定的是 jbpm4_lob 表中的name_列的值  
  5.   
  6.         // 獲取某Deployment中所有文件資源的名稱  
  7.         Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId);  
  8.         for (String name : names) {  
  9.             System.out.println(name);  
  10.         }  
  11.   
  12.         // 獲取某Deployment中指定名稱的資源  
  13.         InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);  
  14.   
  15.         // 保存到"c:/"中  
  16.         OutputStream out = new FileOutputStream("c:/process.png");  
  17.         for (int b = -1; (b = in.read()) != -1;) {  
  18.             out.write(b);  
  19.         }  
  20.         in.close();  
  21.         out.close();  
  22.     }  

5.獲取流程圖中某活動的座標(不重要)

[java] view plain copy
  1. String processDefinitionId = "test-1"// 流程定義的id  
  2.     String activityName = "start1"// 活動的名稱  
  3.     ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName);  
  4.     System.out.println("x=" + c.getX()   
  5.             + ",y=" + c.getY()   
  6.             + ",width=" + c.getWidth()   
  7.             + ",height=" + c.getHeight());  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章