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