1. 程式人生 > >JBPM工作流(四)——管理流程定義

JBPM工作流(四)——管理流程定義

-1 exc xml文件 put gety tar from art 沒有

概念:

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

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

1.部署流程定義

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

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

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

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

  

c)說明

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

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

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

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

2.查詢所有流程定義

a) 查詢所有流程定義

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

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

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

  

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

  

  

   void deleteDeployment(java.lang.String deploymentId):刪除一個部署如果過程定義沒有運行執行。歷史信息(如果有的話)是在數據庫中。
   
   void deleteDeploymentCascade(java.lang.String deploymentId):刪除部署,包含過程定義,相關流程實例和他們的歷史信息

a) 刪除某個Deployment

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

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

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

  

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

a) 查看流程圖

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

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

?
1 2 3 4 5 6 7 String processDefinitionId = "test-1"; // 流程定義的id String activityName = "start1"; // 活動的名稱 ActivityCoordinates c = processEngine.getRepositoryService().getActivityCoordinates(processDefinitionId, activityName); System.out.println("x=" + c.getX() + ",y=" + c.getY() + ",width=" + c.getWidth() + ",height=" + c.getHeight());

  

JBPM工作流(四)——管理流程定義