- 論壇徽章:
- 0
|
一.幾個概念:
process definition (流程定義):
一個process definition代表了一個正式的業(yè)務(wù)流程,它以一個流程圖為基礎(chǔ)。這個流程圖由 許多node和transition組成。每個node在這個流程圖里都有著各自特殊的類型,這些不同的類型決定了node在運行時的不同行為。一個process definition只有一個start state 。
node(節(jié)點) 表示流程中的一個節(jié)點。
c) transition:關(guān)聯(lián)兩個節(jié)點,用于表示節(jié)點的走向
d) token(令牌)
令牌是執(zhí)行的一個路線. 令牌是一個運行時概念,它始終指向流程圖中的某個節(jié)點.
e) process instance(流程實例)
一個process instance(流程實例)即一個process definition(流程定義)的流程執(zhí)行實例。一個process definition可以對應(yīng)多個process instance。當一個process instance被創(chuàng)建的時候,一個主執(zhí)行路徑token同時被創(chuàng)建,這個token叫做root token,它指向流程定義的start state(processDefinition.getStartState()==token.getNode())。
f)signal(信令)
一個signal 發(fā)送給token通知token 繼續(xù)流程的執(zhí)行。如果signal 沒有指定transition,token將沿缺省的transition離開當前狀態(tài),如果signal 指定transition,token將沿指定的transition離開當前的狀態(tài)?丛创a可以看到發(fā)給process instance的signal 其實都是發(fā)送給了root token。
二.主要執(zhí)行類的結(jié)構(gòu)
2.1 GraphElement.java 是所有圖形元素的超類。
有四個屬性:
a)processDefine 表示當前元素屬于哪個流程定義
b)events 表示可以接收哪些event
c)name 名字
d)exceptionHandlers 異常處理類集合(List)
2.2 node(節(jié)點);processDefinition(流程定義);Transition(轉(zhuǎn)換);Task 它們都inherited from GraphElement
1)processDefinition表示流程定義,它有下面的屬性:name(流程名字),version(流程版本),nodes(節(jié)點集),startState(起始節(jié)點) nodes表示流程中定義所有的node(節(jié)點),startState用于啟動流程時找到首節(jié)點
2)Transition表示轉(zhuǎn)換,它有三個屬性:from(Node)-轉(zhuǎn)自某個節(jié)點,to(Node)-轉(zhuǎn)向某個節(jié)點,supportedEventTypes表示支持的事件(event)類型
3)node表示節(jié)點,它有四個屬性:leaving transitions;arriving transitions;action;superState
4)Task 用于定義任務(wù) ,主要定義在task-note中,task-note是節(jié)點(note)的一種。(task和task-note是兩個不同的概念)
2.3各種不同的節(jié)點,它們都inherited from node decision;EndState;Fork;Join;Merge;Milestone; InterleaveEnd;InterleaveStart;ProcessState;State
三.流程執(zhí)行
在整個流程實例運行過程中,我們可以迅速的利用token得到其當前的節(jié)點。在解決“并行”等(比如Fork)問題時,jBpm讓Token對象維護了父子關(guān)系,這種關(guān)系在涉及到Fork的時候會產(chǎn)生。 jBpm讓Token這個對象身兼了多種使命:(1)快速定位current state (2)用于fork,join算法 (3)用于告知任務(wù)執(zhí)行者的任務(wù)索引。
如下代碼:
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
"" +
" " +
" " +
" " +
" " +
" " +
" " +
" " +
" " +
" " +
""
);
// 創(chuàng)建流程實例
ProcessInstance processInstance =
new ProcessInstance(processDefinition);
//取得根令牌
Token token=processInstance.getRootToken();
//信令觸發(fā)流程執(zhí)行
token.signal();
Token的signal方法也可以傳入transition參數(shù),這個方法把信令發(fā)送給Token,這樣,令牌將被激活,并沿指定的transition離開當前的狀態(tài)(如果沒有指定transition,將沿缺省的transition 離開當前狀態(tài)).
1)實例創(chuàng)建時,觸發(fā)process-start相應(yīng)的事件。同時由
Token記錄了當前的節(jié)點(即根節(jié)點),只有當前的狀態(tài)擁有該令牌。
2)向TOKEN發(fā)signal后,當前節(jié)點收到該signal,觸發(fā)before-signal事件 ,執(zhí)行相關(guān)的action,根據(jù)轉(zhuǎn)換(transition)調(diào)用node.leave()函數(shù)觸發(fā)node-leave事件,離開當前節(jié)點。
3)當前狀態(tài)把令牌傳給signal中指定的transition
4)transition收到令牌后,觸發(fā)transition事件,調(diào)用轉(zhuǎn)向節(jié)點(to)的enter事件,將令牌指向to節(jié)點.
5)根據(jù)令牌的位置,流程的狀態(tài)已經(jīng)發(fā)生了扭轉(zhuǎn).
6)上面的各種觸發(fā)的事件events上附上我們自己寫的action,就會帶動action 的執(zhí)行。action里是我們自己的相關(guān)java操作代碼。另外,action也可以直接掛在node上,而不依賴于event(事件)的觸發(fā)!
7)上面的執(zhí)行實例中 node(節(jié)點)有兩個主要的作用:
a)執(zhí)行java代碼,比如說創(chuàng)建task instance(任務(wù)實例)、發(fā)出通知、更新數(shù)據(jù)庫等等。只要在node 上掛上我們的action
b) 控制流程的執(zhí)行:
A、等待狀態(tài)
流程進入到這個node時將處于等待狀態(tài),直到一個signal 的發(fā)出
B、流程將沿著一個leaving transition越過這個node
需要有個action掛在這個node上,action中將會調(diào)用到API里
executionContext.leaveNode(String transitionName),transitionName即這里的leaving transition名字。
C、創(chuàng)建新的執(zhí)行路徑
很典型的就是fork node。流程在這里會分叉,產(chǎn)生新的執(zhí)行路徑。這樣就創(chuàng)建了新的token,每個新的token代表一個新的執(zhí)行路徑。注意的是,這些新的token和產(chǎn)生前的token是父子關(guān)系!
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u/20117/showart_162427.html |
|