Jbpm的使用步驟
A)編寫流程定義(定義規則);
B)部署流程定義到系統中;
C)執行流程(使用指定的流程定義);
使用jBPM提供的JPDL(jBPM Process Definition Language)來描述流程,jPDL是一種直觀的流程語言,可以使用任務、等待狀態、定時器、自動化動作等等圖形化地表示流程。jPDL認為一個商務流程可以被看作是一個UML狀態圖。
流程定義:預先定義的業務流轉邏輯。
流程執行個體(process instance):業務的一次實際流轉過程。(是流程定義執行期間的體現,包含了流程定義被解釋之後的一些資訊,諸如開始時間、結束時間和其他相關聯的資訊)。
任務執行個體(task instance): 組成流程執行個體的元素。(Task被解釋執行時的資訊,有開始時間、結束時間、參與者等,有create、start、end 三種狀態)。
Jbpm的API流程有關的所有資訊都是要儲存到資料庫中的。jBPM的其中一個特色就是它使用Hibernate來管理它的資料庫。這樣,jBPM就將資料的管理職能分離出去,自己則
專註於商務邏輯的處理。
流程中一個比較重要的概念就是令牌(Token),流程執行個體通過Token的維護當前正在執行的節點 。Jbpm是通過Token知道一個流程執行個體現在走到哪個節點,每個流程執行個體都是一個指標,指向當前正在執行的節點,在當前節點執行完後,到達了下一個節點,就是讓這個指標指向下一個節點。這個指標叫做Token(也叫做令牌)。Token是運行時的概念,用來維護指向圖結點的指標。Token需要一個訊號(signal)來讓流程向前執行。當一個signal來到的時候,Token就會通過transition離開當前的結點走到下一個結點。
jbpm中要用的jar包,把它們添加進入項目
jbpm-jpdl.jar(核心);
jbpm-identity.jar(可選,組織機構);
bsh.jar(BeanShell指令碼);
jboss-j2ee.jar;
hibernate3.jar(Hibernate);
antlr-2.7.6.jar(Hibernate);
asm.jar(Hibernate);
cglib.jar(Hibernate);
dom4j.jar(Hibernate);
commons-collections.jar(Hibernate);
commons-logging.jar(Hibernate);
hsqldb.jar(可選,純Java寫的資料庫);
log4j.jar(可選,日誌記錄);
Junit4(單元測試);
添加設定檔(在jbpm-jpdl-3.2.2/config目錄中):
jbpm.cfg.xml;
hibernate.cfg.xml;
log4j.properties(可選,log4j設定檔);
修改資料庫庫串連資訊,如果使用的不是HsqlDB資料庫,還應添加相應的jdbc驅動。
產生資料庫表。
編寫流程步驟,要實現的功能有:
a> 部署流程定義。
b> 啟動流程。
c> 擷取工作清單。
d> 開始任務。
e> 結束任務。
其中編寫流程定義和步驟a是添加流程定義到系統中;步驟b,c,d,e是使用系統中
存在的某個流程定義執行流程;步驟c,d,e是辦理一個任務的過程,流程的執行就
是一次次辦理任務的過程。
有兩個重要的類:JbpmConfiguration和JbpmContext。
JbpmConfiguration是jBPM的相關配置資訊,並有建立JbpmContext的功能,可以把JbpmConfiguration想像成Hibernate中的Configuration與SessionFactory的結合體。使用
JbpmConfiguration.getInstance()方法建立一個JbpmConfiguration對象,這會使用預設的jbpm設定檔:在classpath根目錄中,並且名字為jbpm.cfg.xml。
JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();這個是單一實例
或者是使用getInstance(String configFilePath)方法,用指定的設定檔構造。
Jbpm中幾乎所有的操作都是通過JbpmContext完成的,可以把他想像成Hibernate中的Session。他是通過JbpmConfiguration.createJbpmContext()方法建立的,
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
JbpmContext中封裝有一個Hibernate的Session(通過他做的資料庫操作)。使用完JbpmContext後一定要調用他的close()方法,否則所有資訊都不會持久化到數
據庫當中。
jbpmContext.close(); // 提交/復原 事務,關閉Session
因為在調用JbpmConfiguration.createJbpmContext()方法時會建立一個Hibernate的Session並開始事務;在調用JbpmContext.close()方法時會提交事務並且關閉所關聯的Session。如果在執行JbpmContext.close()之前調用方法jbpmContext.setRollbackOnly(),則在JbpmContext.close()時會復原事務。
jbpmContext.setRollbackOnly();
這個是在部署流程定義失敗的時候,進行復原.這句話的功能不是直接進行復原,而是做個復原標記.在關閉的時候做復原.
部署流程定義:這個過程就是把流程定義的相關資訊儲存到jBPM的資料庫中。
解析流程定義有三種方式,所使用的方法都在ProcessDefinition中,並且都是static的:
1)parseXmlResource方法,parseXmlInputStream方法和parseXmlReader方法,是解析一個xml的流程定義檔案;
2)parseXmlString,是解析一個字串;
3)parseParResource與parseParZipInputStream是解析一個par包。
// pd = ProcessDefinition.parseParResource("helloworld/helloworld.zip");
jbpmContext.deployProcessDefinition(pd);
部署流程定義時,如果存在同名的流程定義,則版本自動累加(加1);如果不存在,則版本為1。
執行流程
流程執行個體可以通過ProcessDefinition.createProcessInstance()方法建立,或者是使用new ProcessInstance(ProcessDefinition pd)並傳遞一個流程定義來建立,總之建立的流程執行個體一定是要是屬於(使用)某個流程定義的。啟動流程後不要忘了使用ProcessInstance.signal()方法離開開始狀態。
ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("helloworld");
ProcessInstance pi = pd.createProcessInstance();
這裡是不用手動儲存的,jbpm會自動執行這個操作.
jbpmContext.save(pi);
建立一個流程執行個體
pi.getRootToken().signal();
關閉開啟的資源.Java會自動回收沒有引用的對象,但不會回收沒有關閉的資源.
jbpmContext.close();
注意:流程定義的名字是processdefinition.xml檔案中的根項目的name屬性的值,不是流程定義檔案的名字!每個節點都有多個任務,工作清單:當前需要辦理(未完成)的任務集合。可以通過TaskMgmtSession獲得。開始任務的方法為:TaskInstance.start();結束任務為:TaskInstance.end(),
開始任務
TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
ti.start();
結束任務
TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
ti.end();
一個任務執行個體只能開始和結束一次(再次開始或結束會拋異常,列印這個任務已經結束了)。