概念:
ProcessDefinition,流程定義:一個流程的步驟說明,如一個請假流程、報銷流程、是一個規則。
ProcessDefinition,流程定義對象,是解析.jpdl.xml文件得到流程步驟的信息。沒有更新操作,啓動流程實例時是使用指定key的最新的版本。
1.部署流程定義
a)一次添加一個資源,相關文件在Classpath中
- // 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包
- @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) 查詢所有流程定義
- @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) 查詢所有最新版本的流程定義
- @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)
a) 刪除某個Deployment
- @Test
- public void deleteById() {
- String deploymentId = "1";
- // // 刪除某Deployment,如果有關聯的執行信息,就拋異常
- // processEngine.getRepositoryService().deleteDeployment(deploymentId);
- // 刪除某Deployment,如果有關聯的執行信息,就級聯刪除
- processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
- }
b) 刪除指定key的所有版本的流程定義
- @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) 查看流程圖
- @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.獲取流程圖中某活動的座標(不重要)
- 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());