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