歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

JBPM工作流

一、JBPM定義

JBPM,全稱是Java Business Process Management(業務流程管理),它是覆蓋了業務流程管理、工作流、服務協作等領域的一個開源的、靈活的、易擴展的可執行流程語言框架。

二、為什麼用JBPM

 業務分析師和開發人員使用的是同一種語言來交談,大大降低了開發的風險,如果要開發一個項目,速度也更快了,因為開發人員不用再將用戶需求轉化成軟件設計了。其次,JBPM采用的不是一般的開發工具,而是自己的圖形化開發工具,非常方便隨時了解和掌握運行的進程。最後,JBPM的流程框架非常靈活,使用起來也非常安全,它經過了安全認證,因此可以保證一些商業機密不被洩露。


三、JBPM環境配置詳解

首先在Eclipse中配置環境。如下:

① 配置GPD(流程設計器)

Help  ------>  Install New Software

點擊add,出現一個Add Repository

點擊Archive,選擇jbbm4.4/install/src/gpd/jbpm-gpd-site.zip

 

 ② 選擇所有插件,然後點Next即可

③ 配置JBPM運行時

1) 打開window --- preferences

1) 選擇 JBoss jBPM --> Runtime Locations

2) 點擊 Add...

3) 在 Add Location 對話框中,輸入一個名字,比如 jbpm-4.4 然後點擊 Search...

4) 在 Browse For Folder 對話框中,選擇你的jbpm 根目錄,然後點擊 OK

④ 在目錄中添加JPDL4模式

如果你想直接編輯XML 源碼, 最好是在你的XML 目錄中指定一下模式(schema),這樣當你在編輯流程源碼的時候,可以更好的幫助你編寫代碼。

1) 點擊窗口 --> 屬性(Windows --> Preferences)

2) 選擇XML --> 目錄(XML --> XML CataLog)

3) 點擊添加(Add)

4) 添加XML 目錄(Add XML Catalog Entry)的窗口打開

5) 點擊map-icon 的圖標下面的按鈕並選擇文件系統(File System)

6) 在打開的對話框中, 選擇jBPM 安裝目錄下src 文件夾中jpdl.xsd 文件

7) 點擊打開(Open)並且關閉所有的對話框

 

 


 

 四、JBPM開發步驟詳解

 ① 引入JAR文件

在jbpm4.4的解壓包中根目錄Jbpm的jar包還有lib文件夾中除report-engine,war包外所有jar包

注:因為Jbpm4.4是用Mysql作為DB的,如果要用Oracle作為DB需要引入相應的驅動包。


 

② 創建配置文件


③ 畫流程圖---[新建jpdl.xml文件]

 

 

並生成jbpmtest.jpdl.xml文件:

 


 五、關鍵代碼

① 創建表18張

[http://www.linuxidc.com/Linux/2017-01/139344.htm]表的詳細說明


②獲取工作流引擎

1 2 3 4 5 6 ProcessEngine processEngine=new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();       @Test   public void test01(){       System.out.println(processEngine);   }

③部署流程定義

? 1 2 3 4 5 6 7 8 9 @Test     public void deploy(){         String deployid = processEngine.getRepositoryService()                 .createDeployment()                 .addResourceFromClasspath("jbpmtest.jpdl.xml")                 .addResourceFromClasspath("jbpmtest.png").deploy();                   System.out.println("部署流程 id:"+deployid);     }

 

④啟動流程實例

1 2 3 4 5 6 7 @Test  public void startTest(){  //啟動流程實例  通過key,key是process節點中的key,如果不寫,默認為name的值 ProcessInstance pi=processEngine.getExecutionService().startProcessInstanceByKey("jbpmtest"); System.out.println("start ok!"); System.out.println("id:"+pi.getId()+",狀態:"+pi.getState()+",流程定義的ID:"+pi.getProcessDefinitionId());  }

 

⑤查看任務列表

1 2 3 4 5 6 7 8 9 10 @Test    public void selectTask(){        String user="張三";        String users="王五";        List<Task> tasks = processEngine.getTaskService().findPersonalTasks(user);             for (Task task : tasks) {            System.out.println("任務ID:"+task.getId()+"\t任務名稱:"+task.getName()+"\t任務辦理人:"+task.getAssignee());        }    }

  

⑥查看當前任務所在點

1 2 3 4 5 @Test     public void findSelect(){         String name = processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpmtest.80001").uniqueResult().findActiveActivityNames().toString();         System.out.println(name);     }

  

⑦辦理任務

1 2 3 4 5 @Test   public void testCompleteTask(){       processEngine.getTaskService().completeTask("10002");       System.out.println("OK");   }

六、流程管理 

 ①查詢所有流程定義

1 ProcessEngine pro=Configuration.getProcessEngine();  

 

1 2 3 4 5 6 7 8 9 10 11 @Test public void findAll(){     List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().list();       for (ProcessDefinition pd : list) {         System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey:"+pd.getKey()+"\t版本號:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId());                         } }

  

②查詢最新版的流程定義

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @Test     public void getNewFindAll(){         //查詢所有,讓最大的版本排到最後面         List<ProcessDefinition> all = pro.getRepositoryService().createProcessDefinitionQuery().orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list();               //過濾出所有最新的版本         Map<String, ProcessDefinition> map=new HashMap<String, ProcessDefinition>();               for (ProcessDefinition pd : all) {             map.put(pd.getKey(), pd);         }         //顯示         for (ProcessDefinition pd : map.values()) {               System.out.println("id=" + pd.getId()// 格式為:{key}-{version},用於唯一的標識一個流程定義                  + ", name=" + pd.getName()// 流程定義的名稱,jpdl.xml中根元素的name屬性的值                  + ", key=" + pd.getKey()// 流程定義的key,jpdl.xml中根元素的key屬性的值,默認是name屬性的值                  + ", version=" + pd.getVersion()// 自動生成的,同一個名稱的第一個為1,以後的自動加1.                  + ", deploymentId=" + pd.getDeploymentId()); // 所屬的部署對象                           }     }

  

③根據id刪除

注:deleteDeploymentCascade級聯刪除

1 2 3 4 5 @Test     public void delById(){         pro.getRepositoryService().deleteDeploymentCascade("1");         System.out.println("del ok!!!");     }

④刪除指定key的所有版本的流程  

1 2 3 4 5 6 7 8 @Test     public void delByKey(){         List<ProcessDefinition> list = pro.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpmtest").list();               for (ProcessDefinition pd : list) {             pro.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());         }     }

 ⑤ZIP 部署 

 

1 2 3 4 5 6 7 8 9 @Test     public void addZip(){         //部署zip格式的資源         InputStream is=this.getClass().getClassLoader().getResourceAsStream("src.zip");         ZipInputStream zs=new ZipInputStream(is);         String id= pro.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();           System.out.println("部署成功:deploymentid:"+id);       }

  

Copyright © Linux教程網 All Rights Reserved