工作流--JBPM核心服務及表結構
一、使用JBPM開發工作流的一般流程
1.jBPM的執行需要資料庫的支援,因此係統設計時要選定所用資料庫。只要是Hibernate支援的資料庫,jBPM就支援。資料庫的初始化可以由jBPM自動完成,也可以通過ant generate.ddl任務生成SQL語句,在jBPM外部自己建立所需的表。
2.使用jPdl定義工作流,生成processdinination.xml檔案。可以採用GUI工具gpdl,但目前只支援jBPM1.0,而且bug很多。XML的DTD定義檔案在jBPM下載包中。
3.Antcreate.pde生成pde包的工作目錄。將processdinination.xml檔案和其它需要的檔案放在指定的目錄下,使用
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_DEPLOYMENT,JBPM4_DEPLOYPROP,JBPM4_LOB儲存流程定義相關的部署資訊
2.JBPM4_EXECUTION主要是存放JBPM4的執行資訊,Execution機制代替了JBPM3的Token機制
3.JBPM4_TASK存放需要人來完成的Activities(活動),需要人來參與完成的Activity 被稱為Task
4.JBPM4_PARTICIPATION參與者表,存放參與者資訊,參與者的種類有Candidate、Client、Owner、Replaced Assignee和Viewer。而具體的參與者既可以是單一使用者,也可以是使用者組
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:對應的引擎KEY的VALUE;
執行流程後,資料庫表變化情況:
釋出一個流程deploy後:
jbpm4_deployment新增一條記錄
jbpm4_deployprop新增三條記錄
jbpm4_lob新增兩條記錄
開始一個流程startProcessInstanceByKey後:
jbpm4_execution新增一條記錄
jbpm4_hist_actinst新增一條記錄
jbpm4_hist_procinst新增一條記錄
jbpm4_hist_task新增一條記錄
jbpm4_task新增一條記錄