1. 程式人生 > >工作流--JBPM核心服務及表結構

工作流--JBPM核心服務及表結構

一、使用JBPM開發工作流的一般流程

1.jBPM的執行需要資料庫的支援,因此係統設計時要選定所用資料庫。只要是Hibernate支援的資料庫,jBPM就支援。資料庫的初始化可以由jBPM自動完成,也可以通過ant generate.ddl任務生成SQL語句,在jBPM外部自己建立所需的表。

2.使用jPdl定義工作流,生成processdinination.xml檔案。可以採用GUI工具gpdl,但目前只支援jBPM1.0,而且bug很多。XMLDTD定義檔案在jBPM下載包中。

3.Antcreate.pde生成pde包的工作目錄。將processdinination.xml檔案和其它需要的檔案放在指定的目錄下,使用

ant build.precess.archives生成pde包。pde包的格式採用jar

4.更改pde工作目錄/src/config/jbpm.properties的相關屬性,主要是設定相關的資料庫連線資訊。注意要將資料庫的JDBC驅動放在pde工作目錄的lib目錄下。

5.Antdeploy.process.archives將剛才生成的pde部署到資料庫。實際上就是向資料庫插入一些相關資料。

6.利用jBPM API函式開發相應的工作流程。

二、提供的服務

JBPM為了支援相應的開發,提供了一組服務,如下圖:


-管理流程定義

     -部署流程定義

     -刪除流程定義

     -

查詢流程定義

public class HelloTest extends TestCase {  
      
    ProcessEngine processEngine;      
      
    public setup() {  
        processEngine = Configuration.getProcessEngine();  
    }  
      
    public void testDeploy(){  
        RepositoryService rs = processEngine.getRepositoryService();  
          
        //釋出流程定義  
        String deploymentId=rs.createDeployment().  
        addResourceFromClasspath("helloworld.jpdl.xml").deploy();  
          
        //獲得流程定義          
        List<ProcessDefinition> list=rs.createProcessDefinitionQuery().list();  
        System.out.println("list.size():"+list.size());  
        for (ProcessDefinition pd : list) {  
            System.out.println("pd.id:"+pd.getId());  
        }  
          
        System.out.println("deploymentId:"+deploymentId);  
        //刪除流程定義  
        rs.deleteDeploymentCascade(deploymentId);  
        //刪除後查詢流程定義  
        System.out.println("after del list count:" + rs.createProcessDefinitionQuery().list().size());                 
    }  
}  

-管理流程例項

     -發起新流程

     -執行等待流程

     -檢視流程例項

     -終止流程例項

     -刪除流程例項

public class ProcessInstanceTest extends TestCase {  
  
    ProcessEngine processEngine;  
      
    public ProcessInstanceTest() {  
        processEngine = Configuration.getProcessEngine();  
    }  
    @Override  
    protected void setUp() throws Exception {  
        processEngine.getRepositoryService().createDeployment()  
        .addResourceFromClasspath("helloworld.jpdl.xml").deploy();  
    }  
      
    /** 
     * 流程例項state節點向下執行 
     */  
    public void testProcessInstance(){  
        ExecutionService es= processEngine.getExecutionService();  
        //流程例項  
        ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
        //state向下執行  
        pi= es.signalExecutionById(pi.getId());  
        System.out.println("pi.isEnded"+pi.isEnded());  
    }  
      
    /** 
     * 終止流程例項 
     */  
    public void testProcessInstanceEnd(){  
        ExecutionService es= processEngine.getExecutionService();         
        //流程例項  
        ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
        //終止流程例項  
        es.endProcessInstance(pi.getId(), "結束流程");  
    }  
      
    /** 
     * 刪除流程例項 
     */  
    public void testProcessInstanceDel(){  
        ExecutionService es= processEngine.getExecutionService();         
        //流程例項  
        ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
        //刪除流程例項  
        es.deleteProcessInstanceCascade(pi.getId());  
    }  
      
    /** 
     * 流程例項列表 
     */  
    public void testProcessInstanceList(){  
        ExecutionService es= processEngine.getExecutionService();         
        //流程例項  
        ProcessInstance pi = null;  
        for (int i = 0; i < 10; i++) {  
            pi= es.startProcessInstanceByKey("helloworld");           
        }  
        //查詢流程例項列表  
        List<ProcessInstance> list= es.createProcessInstanceQuery().list();  
        //輸出列表數到控制檯  
        System.out.println("list.size:"+list.size());  
    }     
}  

三、JBPM表結構介紹

資源庫和執行時表結構

1.JBPM4_DEPLOYMENTJBPM4_DEPLOYPROPJBPM4_LOB儲存流程定義相關的部署資訊

2.JBPM4_EXECUTION主要是存放JBPM4的執行資訊,Execution機制代替了JBPM3Token機制

3.JBPM4_TASK存放需要人來完成的Activities(活動),需要人來參與完成的Activity 被稱為Task 

4.JBPM4_PARTICIPATION參與者表,存放參與者資訊,參與者的種類有CandidateClientOwnerReplaced AssigneeViewer。而具體的參與者既可以是單一使用者,也可以是使用者組

5.JBPM4_SWIMLANE泳道表。SwimLane是一種Runtime Process Role。通過SwimLane,多個Task可以一次分配到同一Actor身上 JBPM4_JOB  存放的是Timer 的定義 JBPM4_VARIABLE 存的是進行時的臨時變數。

歷史資料庫表結構

1.JBPM4_HIST_PROCINST流程例項歷史表

2.JBPM4_HIST_ACTINST流程節點(活動)歷史表

3.JBPM4_HIST_DETAIL儲存流程例項、活動例項、任務例項執行過程中歷史明細資料

4.JBPM4_HIST_VAR儲存歷史的流程變數資料

5.JBPM4_HIST_TASK儲存歷史的任務例項記錄

身份認證表

1.JBPM4_ID_GROUP使用者組表

2.JBPM_ID_MEMBERSHIP儲存使用者和使用者組之間的關聯關係

3.JBPM4_ID_USER使用者表

這三張表很常見,基本的許可權控制,關於使用者認證方面建議還是自己開發一套,元件自帶的功能太簡單,使用中有很多需求難以滿足

引擎引數表

1.JBPM4_PROPERTY引擎引數表,記錄JBPM的一些引擎引數,會儲存一些初始設定的種子資料;例如引擎版本(KEY=db.version ,ID生成器版本(KEY=next.dbid)KEY:引擎KEY,比如next.dbid 下次執行的DBID_VERSION:版本號、VALUE:對應的引擎KEYVALUE

執行流程後,資料庫表變化情況:

釋出一個流程deploy後:

jbpm4_deployment新增一條記錄

jbpm4_deployprop新增三條記錄

jbpm4_lob新增兩條記錄

開始一個流程startProcessInstanceByKey後:

jbpm4_execution新增一條記錄

jbpm4_hist_actinst新增一條記錄

jbpm4_hist_procinst新增一條記錄

jbpm4_hist_task新增一條記錄

jbpm4_task新增一條記錄