jBPM開(kāi)發(fā)整理
http://www.cn-java.com/www1/?uid-550631-action-viewspace-itemid-4212jBPM開(kāi)發(fā)整理
1. 概述
jBPM是一個(gè)工作流平臺(tái),它實(shí)現(xiàn)了一系列的基礎(chǔ)類,提供了面向圖形編程的方式來(lái)定義流程,方便用戶在此基礎(chǔ)上專注業(yè)務(wù)流程邏輯的實(shí)現(xiàn);他依賴很少的庫(kù)文件,能很好地嵌入到已有的Java Project當(dāng)中。
jBPM采用Hibernate進(jìn)行數(shù)據(jù)持久化的管理;
一般的開(kāi)發(fā)流程為:
1.選定數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)進(jìn)行初始化;jBPM平臺(tái)本身需要數(shù)據(jù)庫(kù)的支持,
所以在使用jBPM之前要先初始化相應(yīng)的數(shù)據(jù)庫(kù),包括創(chuàng)建表和插入初始
化數(shù)據(jù)等。
2.使用JBPM定義流程,生成ProcessDefinition.xml;并加入自定義的處理代碼,如Action等。
3.利用JUnit Framework寫(xiě)單元測(cè)試。
4.部署jBPM。
2. 環(huán)境配置
2.1 Eclipse
1.為了支持圖形化的流程定義,安裝jBPM圖形化插件,位置為:
\jbpm-starters-kit-3.1.1\jbpm-designer\jbpm-gpd-feature\eclipse
2.2 Library
2.JBPM庫(kù):
jBPM核心功能庫(kù):jbpm-[version].jar (位于jbpm/build下)
jBPM可選的身份驗(yàn)證庫(kù):jbpm-[version].jar(位于jbpm/build下)
3.必須的第三方庫(kù):(位于jbpm/lib下)
XML分析庫(kù):dom4j-1.6.1.jar
Logging庫(kù):commons-logging.jar
4.可選的第三方庫(kù):
見(jiàn)User Guide Chapter 5
2.3 Configuration Files
Table 2-1 Configuration Files
路徑
|
作用描述
|
src/config.files/jbpm.cfg.xml
|
配置jBPM參數(shù)
|
src/config.files/hibernate.cfg.xml
|
配置Hibernate連接參數(shù)等
|
org/jbpm/db/hibernate.queries.hbm.xml
|
定義了Hibernate的常用查詢Query
|
org/jbpm/graph/node/node.types.xml
|
Node類型和對(duì)應(yīng)實(shí)現(xiàn)類的映射
|
org/jbpm/graph/action/action.types.xml
|
Action類型和對(duì)應(yīng)實(shí)現(xiàn)類的映射
|
org/jbpm/calendar/jbpm.business.calendar.properties
|
定義了Business Hour和Free Time
|
org/jbpm/context/exe/jbpm.varmapping.xml
|
定義了使用何種類完成某種Java對(duì)象轉(zhuǎn)換為jBPM中可存儲(chǔ)的數(shù)據(jù)庫(kù)實(shí)例
|
org/jbpm/db/hibernate/jbpm.converter.properties
|
定義了ID和Class Name的映射
|
org/jbpm/graph/def/jbpm.default.modules.properties
|
定義了創(chuàng)建ProcessDefinition時(shí),缺省加載的模塊
|
org/jbpm/jpdl/par/jbpm.parsers.xml
|
定義了分析器
|
3. 開(kāi)發(fā)步驟
3.1創(chuàng)建jBPM項(xiàng)目
1.在Eclipse中創(chuàng)建一個(gè)Process Project項(xiàng)目
3.2 配置數(shù)據(jù)庫(kù)
1.下載PostgreSQL、pgAdmin和dbVisualizer
Account:qlisguo/leesen;SuperUser:postgres/leesen127
2.創(chuàng)建JbpmDB數(shù)據(jù)庫(kù);
3.運(yùn)行jbpm-db/build/postgresql/scripts/postgresql.create.sql,為jBPM創(chuàng)建
初始化的表、索引等;
4.可選:為了讓jBPMStarterKit自帶的WebApp能運(yùn)行,必須對(duì)
jbpm_id_user初始化,加入一些帳號(hào);
5.可選:為了讓jBPMStarterKit自帶的WebApp運(yùn)行,必須修改已部署的
JBoss的配置文件,配置數(shù)據(jù)源;
6.修改jbpm 項(xiàng)目中Hibernate的數(shù)據(jù)庫(kù)連接配置文件Hibernate.cfg.xml;
3.3 流程定義
1.在Processes目錄下創(chuàng)建一個(gè)ProcessDefinition Project;
2.利用圖形化界面對(duì)ProcessDefinition.xml進(jìn)行業(yè)務(wù)邏輯流程的定義;
3.4 JUnit測(cè)試
1.src/java.jbpm.test 是StarterKit 自帶的測(cè)試用例
2.繼承junit.framework.TestCase類
3.jBPM工作流的測(cè)試流程
3.5 部署
4. jBPM流程整理
創(chuàng)建ProcessDefinitionà創(chuàng)建ProcessInstanceàToken.signal();
一個(gè)Process Definition即是一張有向圖,由Node和Transition完成流程的執(zhí)行。
Token:
· 是一個(gè)鏈表結(jié)構(gòu),具有唯一的父Token和若干子Token;每個(gè)Token都包含一個(gè)Node節(jié)點(diǎn)指針;這意味著,Token鏈表表示了一條流程的執(zhí)行路徑。
· 當(dāng)一個(gè)ProcessInstance被創(chuàng)建時(shí),一個(gè)rootToken同時(shí)被創(chuàng)建。
· Token.signal()方法調(diào)用 Node.leave(),Node.leave() 設(shè)置Token的當(dāng)前Node為新的Node,從而讓流程繼續(xù)下去。其執(zhí)行路進(jìn)如下所示:
Token.signal()
àNode.leave()
àTransition.take()
àNode.enter()
àNode.execute()
· 當(dāng)Token進(jìn)
入一個(gè)Node時(shí),該Node的execute方法即被調(diào)用,每個(gè)Node都可以在execute()方法中定義自己的流程執(zhí)行方式。而 State
類型的Node是不會(huì)傳播執(zhí)行的,即當(dāng)Token進(jìn)入State Node時(shí),只能通過(guò)Token.signal()方法,顯式地去讓流程繼續(xù)。
Node:
· Node有
兩個(gè)責(zé)任:1)執(zhí)行純java代碼,比如創(chuàng)建Task,更新數(shù)據(jù)庫(kù)等;2)負(fù)責(zé)傳播執(zhí)行流程:不傳播(內(nèi)置的Node Type中只有State
Node不傳播);自動(dòng)選擇一條Leave Transition,繼續(xù)流程;創(chuàng)建新的執(zhí)行路徑即新的Token(例如Fork
Node);結(jié)束流程;更改流程執(zhí)行時(shí)的結(jié)構(gòu),即Token Tree。
· 每種Node Type都重載了Node 類的execute方法,其中只有State Node的execute()方法為空,即意味著當(dāng)Token進(jìn)入State Node時(shí),流程即停止在此。
Node Type
|
Description
|
Task Node
|
當(dāng)流程進(jìn)入該Node時(shí),該Node會(huì)創(chuàng)建一系列的Tasks;然后等待這些Tasks完成;當(dāng)Tasks完成之后,則會(huì)調(diào)用token.signal()方法,使流程自動(dòng)執(zhí)行下去。
|
State
|
要顯示調(diào)用token.signal()方法,才能使流程繼續(xù)
|
Actions:
5. jBPM APIs 整理
5.1 ProcessDefinition
里面包含Node,Tasks,Swimlane,Transition等的定義,可以利用getXXX方法獲得其中的元素。
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"<process-definition>" +
" <task-node name='saturday afternoon'>" +
" <task name='wash car'>" +
" <assignment class='the-wash-car-assignment-handler-class-name' />" +
" </task>" +
" </task-node>" +
"</process-definition>"
);
5.2 Configuration、Context
bpmConfiguration jbpmConfiguration = JbpmConfiguration.parseResource("org/jbpm/jbpm.test.cfg.xml");
jbpmContext = getJbpmConfiguration().createJbpmContext();
從jbpmContext中可以獲得所有的session,例如getGraphSession()…
5.3 ContextInstance操作變量
· org.jbpm.module.exe.ModuleInstance.ContextInstance類負(fù)責(zé)對(duì)變量進(jìn)行操作。
· 獲取一個(gè)ContextInstance:
ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
· Variables的
持久化是伴隨JbpmContext的save(ProcessInstance)方法的,因?yàn)閂ariables是ProcessInstance的一
部分;如果有不想持久化的Variable的話就利用ContextInstance.setTransientVariable(),創(chuàng)建臨時(shí)變量。
5.4 org.jbpm.context.log變量日志管理
· 記錄的Variable的更新,刪除,創(chuàng)建等日志
5.5 Task任務(wù)管理
· TaskMgmtDefinition管理Task所和Swimlane
taskMgmtDefinition = processDefinition.getTaskMgmtDefinition();
processDefinition = new ProcessDefinition();
taskMgmtDefinition = new TaskMgmtDefinition();
processDefinition.addDefinition(taskMgmtDefinition);
buyer = new Swimlane("buyer");
laundry = new Task("laundry");
dishes = new Task("dishes");
· TaskNodeàTaskàTaskControlleràVariableAccess 層次關(guān)系。
TaskController.submitParameters()方法,可以把TaskInstance的Task Variable新值更新到對(duì)應(yīng)的Process Variable;
· TaskMgmtInstance運(yùn)行時(shí)的任務(wù)管理
TaskMgmtInstance tmi = (TaskMgmtInstance) processInstance.getInstance(TaskMgmtInstance.class);
· TaskInstance可以調(diào)用set/getVariable()方法,對(duì)Task的Local變量進(jìn)行存取
· TaskMgmtInstance.createStartTaskInstance(),創(chuàng)建start state 中的任務(wù),并把該任務(wù)分派給當(dāng)前的Actor。
5.6 Swimlane的整理
1.Swimlane是task的role。Tasks可以分配給swimlane,同時(shí)users、group也可以被指派到swimlane,通過(guò)
swimlane這作橋梁,tasks就被分配給了特定的users。 需要注意的是,swimlane不包含授權(quán)控制,即如果user A
沒(méi)有通過(guò)swimlane分配到task A,user A仍然可以通過(guò) task.end()來(lái)結(jié)束任務(wù)。
5.7 Token的整理
1.當(dāng)創(chuàng)建一ProcessInstance時(shí),自動(dòng)創(chuàng)建了一rootToken
2.
當(dāng)rootToken 進(jìn)入Fork Node 時(shí),就會(huì)自動(dòng)根據(jù)Transition
名創(chuàng)建子Token(/TransitionName),而rootToken則在Fork
Node處等待,通過(guò)ProcessInstance.findToken()找到子Token繼續(xù)分支流程的完成,待所有的分支流程完成,則
rootToken被自動(dòng)激發(fā)到 Join Node 的下一個(gè)節(jié)點(diǎn)。分支流程的token起始指向的Node就是ForkNode對(duì)應(yīng)的
Transition to的節(jié)點(diǎn)。
3.Decision Node 根據(jù)指定的Decision Handle ,來(lái)決定選擇哪一條transition
posted on 2008-09-18 10:45 gdufo 閱讀(565) 評(píng)論(0) 編輯 收藏 所屬分類: workflow