今天是jBPM的第二天,內(nèi)容不多,定義不少,主要講了流程變量,節(jié)點(diǎn)和事件等知識(shí),全是新的知識(shí),剛學(xué)肯定生疏,久了就沒(méi)問(wèn)題了,編程嘛,多敲代碼,多
調(diào)試,才是王道。
1. 流程變量
通過(guò)org.jbpm.context.exe.ContextInstance來(lái)操
作變量。
2.變量的生命周期
變量的訪問(wèn)和賦值是在某一個(gè)token上進(jìn)行的,缺省時(shí),是基于root
Token。每個(gè)Token(執(zhí)行路線)有它自己的一套流程變量。變量的作用域和所屬的Token的生命周期一致,不同的Token上的同名變量互不影
響。
3.變量值要求
變量名的類(lèi)型為java.lang.String,支持的變量值類(lèi)型如下(文檔10.1節(jié))。(
如
果變量值是classes that are persistable with
hibernate,則POJO的id應(yīng)為long型或String型。
saveOrUpdate( po );
savePoIdAndPoClassAsVariable()
session.get(
class, id )
節(jié)點(diǎn)
1.
流程圖中的各種節(jié)點(diǎn)的作用及用法
為什么需要多種節(jié)點(diǎn)類(lèi)型?
需要有不同類(lèi)型(作用)的節(jié)點(diǎn),才能設(shè)計(jì)出復(fù)雜的流程圖。
Jbpm有一套預(yù)先定義好的節(jié)點(diǎn)類(lèi)型。如果不夠用,也可以使用自定義節(jié)點(diǎn)進(jìn)行擴(kuò)展,以完成不同的流程的需要。
不同的節(jié)點(diǎn)類(lèi)型代表不同的行
為。
每個(gè)流程都必須要有開(kāi)始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)。
2.預(yù)定義節(jié)點(diǎn)
start-state,開(kāi)始節(jié)點(diǎn):標(biāo)識(shí)流
程開(kāi)始、
end-state,結(jié)束節(jié)點(diǎn):標(biāo)識(shí)流程結(jié)束、
task-node,任務(wù)節(jié)點(diǎn):可以放0個(gè)或多個(gè)任務(wù)、
decision,
決策節(jié)點(diǎn):路徑選擇,只使用一個(gè)流轉(zhuǎn)(叉路口)、
fork/join,分支節(jié)點(diǎn)/合并節(jié)點(diǎn):可以分為多個(gè)并行執(zhí)行的分支、
state,狀
態(tài)節(jié)點(diǎn):等待。
每個(gè)節(jié)點(diǎn)都對(duì)應(yīng)一個(gè)類(lèi)(Jbpm的持久化類(lèi)),都是org.jbpm.graph.def.Node的子類(lèi)。節(jié)點(diǎn)
都有名字、流轉(zhuǎn)(end-state除外)。
event事件
事
件。
1, 有幾種事件,分別在什么時(shí)候觸發(fā)
2, 怎么指定當(dāng)事件觸發(fā)時(shí)做什么事(Action)
1, 節(jié)點(diǎn)的事件
a)
進(jìn)入節(jié)點(diǎn)(node-enter)。(開(kāi)始節(jié)點(diǎn)沒(méi)有)
b) 離開(kāi)節(jié)點(diǎn)(node-leave)。(結(jié)束節(jié)點(diǎn)沒(méi)有)
2,
流轉(zhuǎn)的事件
a) 只有一個(gè):使用流轉(zhuǎn)(take a transition)
3, 任務(wù)的事件
a)
創(chuàng)建任務(wù)(task-create)
b) 分配任務(wù)(task-assign)
c)
開(kāi)始任務(wù)(task-start)à TaskInstance.start()
d) 結(jié)束任務(wù)(task-end)à
TaskInstance.end()
每個(gè)事件有一個(gè)動(dòng)作(action)清單。當(dāng)jBPM引擎產(chǎn)生一個(gè)事件,動(dòng)作(action)清單就會(huì)被
執(zhí)行. 不同的節(jié)點(diǎn)支持的事件類(lèi)型不同,是由event元素所在的節(jié)點(diǎn)的類(lèi)型決定的,例如transition只有一個(gè)事件。
可以在event元
素用可以指定一個(gè)動(dòng)作,當(dāng)指定的事件發(fā)生時(shí),這個(gè)動(dòng)作被執(zhí)行。
可以給同一個(gè)事件指定多個(gè)動(dòng)作,當(dāng)這個(gè)事件觸發(fā)的時(shí)候,這些動(dòng)作執(zhí)行的順序
和定義先后順序是一致的。
不同元素支持不同的事件類(lèi)型:
一般的節(jié)點(diǎn)都具有的事件:node-enter,進(jìn)入節(jié)點(diǎn)、
node-leave,離開(kāi)節(jié)點(diǎn);
start-state只有node-leave;
end-state只有node-enter;
transition
只有一個(gè)執(zhí)行轉(zhuǎn)換的事件(taking a transition)。因?yàn)橹挥幸粋€(gè)事件,所以配置時(shí)不用寫(xiě)event元素,而直接配置Action。
task
有task-create,任務(wù)創(chuàng)建、task-assign,任務(wù)分配、task-start,任務(wù)開(kāi)始、task-end,任務(wù)結(jié)束。
關(guān)
于哪些元素支持哪些事件,可以通過(guò)文檔的18.4節(jié)中的xml文件的寫(xiě)法中獲得。
如果配置的事件類(lèi)型不存在,不會(huì)報(bào)錯(cuò),也不會(huì)執(zhí)行。
注
意:在事件中定義的動(dòng)作(Action)不應(yīng)該(不能)影響流程的執(zhí)行。即不要在事件的動(dòng)作中給token發(fā)信號(hào),否則會(huì)拋異常:token is
locked。(在Node中配置的Action可以給Token發(fā)信號(hào)。)
事件執(zhí)行的順序:
已觸發(fā)事件:node-leave
已觸發(fā)事件:transition
已
觸發(fā)事件:node-enter
已觸發(fā)事件:task-create
已觸發(fā)事件:task-assign
已
觸發(fā)事件:task-start
已觸發(fā)事件:task-end
*************************
動(dòng)態(tài)的創(chuàng)建不確定數(shù)量的任務(wù)實(shí)例 *********
會(huì)簽。
實(shí)現(xiàn)任務(wù)分配給多個(gè)人,在流程定義中定義的相
應(yīng)的任務(wù),不指定參與者,也不知道指定為誰(shuí)。需要做以下工作:
1,
阻止jBPM自動(dòng)創(chuàng)建任務(wù)實(shí)例(設(shè)置task-node的create-tasks="false")
2,
在node-enter事件中定義一個(gè)動(dòng)作指定用于創(chuàng)建TaskInstance的類(lèi)。
類(lèi)
CreateTaskInstancesAction要接管兩個(gè)操作:創(chuàng)建與分配任務(wù)實(shí)例。
創(chuàng)建任務(wù)實(shí)例要調(diào)用方法:
TaskMgmtInstance.createTaskInstance(Task, ExecutionContext);
其中的
Task 是任務(wù)的定義,可以先得到當(dāng)前的節(jié)點(diǎn):
TaskNode taskNode = (TaskNode)
executionContext.getNode();
然后通過(guò)任務(wù)的名字得到任務(wù)的定義:
Task task =
taskNode.getTask("審批");
任務(wù)分配
個(gè)人任務(wù):actor-id=”xxx”
查詢(xún)組任務(wù)列表的方法為:
TaskMgmtSession.findPooledTaskInstances(String
actorId)
對(duì)于一個(gè)組任務(wù),如果他的actorId為null,組中所
有的用戶(hù)都可以在組任務(wù)列表中看到這個(gè)任務(wù)。如果使用TaskInstance.setActorId(String)方法設(shè)置這個(gè)任務(wù)由指定的
acrorId來(lái)辦理,這時(shí)pooledActors中的其他人就看不到這個(gè)任務(wù)了,就是說(shuō)actorId會(huì)屏蔽pooledActors;
當(dāng)這個(gè)用戶(hù)因某些原因不能辦理任務(wù)時(shí),可以把這個(gè)任務(wù)再退回到組任務(wù)列表中,方法是調(diào)用TaskInstance.setActorId(null)設(shè)置
actorId為null,這時(shí)pooledActors中的所有人又都可以看到這個(gè)任務(wù)了。
不管使用哪種方式分配任務(wù),參與者
(Actor-id,字符串類(lèi)型)的計(jì)算(確定)都是由業(yè)務(wù)層負(fù)責(zé)解釋的。
最后湯兄給我們推薦了一些好書(shū),學(xué)習(xí)java必須準(zhǔn)備三樣: 心態(tài),基礎(chǔ),睡覺(jué)。能學(xué)多少學(xué)多少。明天才是OA工作流項(xiàng)目的開(kāi)始!加油。。。
posted on 2010-02-01 21:59
d66380022 閱讀(262)
評(píng)論(0) 編輯 收藏