1.實例化流程定義類,可選的方式包括:
ProcessDefinition.parseXmlResource("websale.par/processdefinition.xml");
1.1 裝載 指定名字的文件為一個InputStream
1.2 解析這個InputStream中的流程定義xml
1.3 包裝 InputStream為 InputStreamReader
1.4 實例化 JPDLReader
1.5 請求 JPDLReader.readProcessDefinition
1.5.1 創(chuàng)建流程定義的實例 processDefinition = ProcessDefinition.createNewProcessDefinition();
1.5.1.1 實例化 ProcessDefinition
1.5.1.2 裝載 module定義對象 到 流程定義對象中,module定義于"jbpm.default.modules.properties"文件
1.5.2 請求 SchemaValidationHelper校驗 流程定義文件是否符合其Schema
1.5.3 解析流程定義xml文件的根元素下的各個元素
1.5.3.1 解析 swimlane
1.5.3.1.1 解析每個 swimlane 定義,針對每個 swimlane定義
1.5.3.1.1.1 生成一個 swimlane對象
1.5.3.1.1.2 生成 assignment元素的 class屬性所指定的類的對象(稱為 委托對象),并放置到 swimlane對象中。
1.5.3.1.1.3 如果沒有assignment元素,并且 該 swimlane 也不是 starttask所引用的swimlane,則 addWarning。
1.5.3.1.1.4 將swimlane追加加到 taskMgmtDefinition 的屬性中。
1.5.3.2 解析 actions
1.5.3.2.1 遍歷根元素下的每個Action元素
1.5.3.2.2 如果 該action的名字符合 給定的類型,則創(chuàng)建Action:createAction
1.5.3.2.2.1 在ActionTypes中找到當前Action的name所對應的class,并實例化該class(即action對象)
1.5.3.2.2.1.1 設置action對象的name
1.5.3.2.2.1.2 在ProcessDefinition對象的actions屬性中追加action
1.5.3.2.2.1.2.1 解析 各Action元素的特殊屬性到 Action對象中
1.5.3.2.2.1.2.1.1 如果是普通Action元素
1.5.3.2.2.1.2.1.1.1 如果 action元素的 ref-name屬性 不為空,則 在JpdlXmlReader 的 unresolvedActionReferences屬性中追加 該action元素和action對象
1.5.3.2.2.1.2.1.1.2 如果 action元素的 class 屬性 不為空,則
1.5.3.2.2.1.2.1.1.3 實例化 Delegation,將實例化后的對象作為action對象的屬性。
1.5.3.2.2.1.2.1.1.4 調(diào)用Delegaton的 read方法,解析action元素的class、config-type等屬性到delegation對象中,并解析 元素的content到delegation對象中
1.5.3.2.2.1.2.1.1.5 根據(jù) action元素的accept-propagated-events 屬性,決定action對象的isPropagationAllowed屬性(該屬性決定該actions是否只處理該action所關(guān)聯(lián)的元素發(fā)出的事件,不處理子元素傳來的事件)
1.5.3.2.2.1.2.1.2 如果是 CancelTimerAction 元素
1.5.3.2.2.1.2.1.2.1 將“the name of the timer to be cancelled” 放置到 CancelTimerAction對象的屬性中
1.5.3.2.2.1.2.1.3 如果是 CreateTimerAction 元素
1.5.3.2.2.1.2.1.3.1 解析“the name of the timer”
1.5.3.2.2.1.2.1.3.2 解析該元素下單個的Action元素(可能是 Action或script)
1.5.3.2.2.1.2.1.3.3 解析“time period between the creation of the timer and the execution of the timer”
1.5.3.2.2.1.2.1.3.4 解析“duration between repeating timer executions until the node is left”
1.5.3.2.2.1.2.1.3.5 解析 “a transition-name to be taken when the timer executes”
1.5.3.2.2.1.2.1.4 如果是 Script 元素
1.5.3.2.2.1.2.1.4.1 如果將表達式直接放在了 script元素的 content中,則直接解析該content作為 script對象的expression屬性
1.5.3.2.2.1.2.1.4.2 否則,解析變量定義;解析 expression子元素的內(nèi)容,作為script對象的expression屬性
1.5.3.3 解析 nodes
1.5.3.3.1 遍歷所有root元素的子元素,對于那些元素名稱表明其是 node 的(通過查詢NodeTypes來判定,因為NodeTypes中記錄了合法的node元素的名稱),進行處理
1.5.3.3.2 實例化 node 元素所對應的類,將流程定義對象 設置到 具體node對象的屬性中。
1.5.3.3.3 解析node元素的公共部分
1.5.3.3.3.1 在ProcessDefinition 的notes屬性中,追加本元素對應的node具體實現(xiàn)對象,如果本元素是StartState,則在ProcessDefinition中的startState屬性為該元素的實現(xiàn)node
1.5.3.3.3.2 解析node 的子元素
1.5.3.3.3.2.1 解析子元素timer
1.5.3.3.3.2.1.1 解析給定node元素下的所有 Timer子元素
1.5.3.3.3.2.1.2 針對每個timer 子元素
1.5.3.3.3.2.1.2.1 新建 “創(chuàng)建timer”的action,將其加入node 的enter事件中
1.5.3.3.3.2.1.2.2 新建“取消timer”的action,將其加入 node 的leave事件中
1.5.3.3.3.2.2 解析子元素 event
1.5.3.3.3.2.2.1 解析給定node元素下的所有 event 子元素
1.5.3.3.3.2.2.2 遍歷所有event元素,創(chuàng)建對應的event ,增加到node中
1.5.3.3.3.2.2.3 遍歷給定event元素下的所有action元素,創(chuàng)建對應的action,將action增加到 event中
1.5.3.3.3.2.3 解析子元素 execptionHandler
1.5.3.3.3.2.3.1 遍歷給定node元素下的所有 exception-handler 子元素
1.5.3.3.3.2.3.2 解析每個 exception-handler,設置該處理器所處理的違例的名稱,在node 中,增加該違例處理器,解析違例處理器下的每個action.
1.5.3.3.3.2.4 將該node 保存在 尚未解析轉(zhuǎn)移 的node 的列表中.在JpdlXmlReader的未確定轉(zhuǎn)移unresolvedTransitionDestinations屬性中,追加本node元素和本node元素對應的node 實現(xiàn)
1.5.3.3.4 解析node元素的特殊部分
1.5.3.3.4.1 如果是 node,則 解析 node 中唯一的 action元素
1.5.3.3.4.2 如果是 decision,則 解析 其 handler的delegation,解析引出 transition和transition的條件
1.5.3.3.4.3 如果是 EndState/Join/State,則 沒有特殊部分需要解析。
1.5.3.3.4.4 如果是 fork ,則 解析其 script子元素
1.5.3.3.4.5 如果是 process-state,則
1.5.3.3.4.5.1 解析 sub-process元素,獲得子流程名稱和版本,然后從數(shù)據(jù)庫中提取該流程的定義。
1.5.3.3.4.5.2 解析 variable元素,獲得變量名字、訪問級別、變量在子流程中映射的名稱
1.5.3.3.4.6 如果是 StartState,則 在TaskMgmtDefinition找到 該元素的swimlane,如果有task子元素,則解析該task,并在TaskMgmtDefinition中設置startTask屬性,在task對象中設置startState屬性
1.5.3.3.4.7 如果是 superState,則 解析 該 superState中的所有node,執(zhí)行方式同 1.5.3.3
1.5.3.3.4.8 如果是 taskNode,則
1.5.3.3.4.8.1 解析signal屬性(決定多個任務中,哪個任務能繼續(xù)傳遞本node的Token) ;
1.5.3.3.4.8.2 解析 createTasks屬性,決定是否自動創(chuàng)建task;
1.5.3.3.4.8.3 解析taskNode中的每個task元素
1.5.3.3.4.8.3.1 獲得 taskNode的每個task子元素,針對每個task元素進行解析 readTask
1.5.3.3.4.8.3.1.1 實例化task類,設置processDefinition對象到其屬性中,設置task元素的name 屬性到其name屬性
1.5.3.3.4.8.3.1.2 taskMgmtDefinition中的tasks屬性中,追加本task對象
1.5.3.3.4.8.3.1.3 解析每個timer子元素(readTaskTimers)
1.5.3.3.4.8.3.1.3.1 實例化 CreatTimerAction,解析 timer屬性到 該對象中
1.5.3.3.4.8.3.1.3.1.1 解析 timer的name
1.5.3.3.4.8.3.1.3.1.2 解析 timer的action 子元素
1.5.3.3.4.8.3.1.3.1.3 解析 timer中的 dudate 屬性(timer從創(chuàng)建到其執(zhí)行的持續(xù)時間)
1.5.3.3.4.8.3.1.3.1.4 解析 timer中的 repeat 屬性
1.5.3.3.4.8.3.1.3.1.5 解析 timer中的 transition 屬性(到期后執(zhí)行的轉(zhuǎn)移)
1.5.3.3.4.8.3.1.3.2 在 該task 創(chuàng)建EVENTTYPE_TASK_CREATE 事件,在該事件中創(chuàng)建 上面的 CreateTimerAction
1.5.3.3.4.8.3.1.3.3 在該Timer元素中找到 “cancel-event” 屬性,該屬性指定 哪些事件中取消timer,可以指定多個事件
1.5.3.3.4.8.3.1.3.3 在task中 創(chuàng)建 可以取消 timer的事件,并在這些事件中指定 cancelTimer的Action
1.5.3.3.4.8.3.1.4 解析每個event子元素(readEvents),增加 event 以及 event對應的Action到Task中。
1.5.3.3.4.8.3.1.5 解析違例處理器: readExceptionHandlers。在Task中增加違例處理器,為例處理器中的屬性指定了該違例處理器究竟處理哪個違例(或者所有違例),并且指定了發(fā)生違例時進行處理的Action
1.5.3.3.4.8.3.1.6 設置 Task的 "description"、"dueDate"、"priority"
1.5.3.3.4.8.3.1.7 在TaskNode對象 中 追加本 Task對象
1.5.3.3.4.8.3.1.8 設置Task 的 "blocking"屬性,該屬性指出,是否等待本Task完成時,本node 上的Token才能離開
1.5.3.3.4.8.3.1.9 處理參與者分配
1.5.3.3.4.8.3.1.9.1 解析 task的 swimlane屬性和assignment子元素
1.5.3.3.4.8.3.1.9.2 如果設置了 swimlane,在taskMgmtDefinition中找到 已經(jīng)解析過的swimlane的定義,并將其設置到Task
1.5.3.3.4.8.3.1.9.3 如果沒有設置 swimlane,但設置了 "assignment" 子元素
1.5.3.3.4.8.3.1.9.3.1 解析 "assignment" 的委托類
1.5.3.3.4.8.3.1.9.3.1.1 如果 "assignment"元素 有"expression"屬性,則 為委托類對象設置流程定義對象,設置表達式分配處理類名稱,設置表達式
1.5.3.3.4.8.3.1.9.3.1.2 如果 "assignment"元素 沒有"expression"屬性,則請 委托類 解析 assignment的定義,包括:解析 class名稱、config-type、以及 assignment的content
1.5.3.3.4.8.3.1.9.3.2 將 "assignment" 的委托類的對象 設置到Task的屬性中
1.5.3.3.4.8.3.1.10 解析 “task controller”(等同于 應用形參)
1.5.3.3.4.8.3.1.10.0 實例化 TaskController 類
1.5.3.3.4.8.3.1.10.1 如果包含 class屬性,則解析 出一個委托類,將其添加到taskController對象中
1.5.3.3.4.8.3.1.10.2 否則,解析變量訪問的設置
1.5.3.3.4.8.3.1.10.2.1 解析每個變量子元素,獲得變量名稱、訪問限制、在 委托類里的映射名稱
1.5.3.3.4.8.3.1.10.2.2 將所有變量的設置 添加到 taskController對象中
1.5.3.3.4.8.3.1.11 將TaskController 放到 Task 對象屬性中
1.5.3.4 解析 events,尋找根元素下的所有Event子元素,在ProcessDefinition中增加event,為event增加其對應的所有Action
1.5.3.5 解析 違例處理器,尋找根元素下的所有違例處理器子元素,解析其處理的違例,其采取的action,將違例處理器 追加到 ProcessDefinition的屬性中
1.5.3.6 解析Task,尋找根元素下的所有task子元素,對其解析,并追加到 ProcessDefintion的taskMgmtDefintion的屬性中
1.5.3.6 解析每個node元素的 引出轉(zhuǎn)移, resolveTransitionDestinations
1.5.3.6.1 找到每個node 元素,以及node 類對象,針對每個node 元素
1.5.3.6.1.1 尋找每個 transition,針對每個Transition
1.5.3.6.1.1.1 實例化Transition,將 processDefintion 作為 transition 對象的一個屬性 ,設置transiton 的name
1.5.3.6.1.1.2 在 node 的引出轉(zhuǎn)移 屬性中 增加該 transition,將該transition 的from屬性 設置為該node
1.5.3.6.1.1.3 尋找 該轉(zhuǎn)移的目標node 的名稱,并在 當前node 的容器中(可能是processDefinition或 superState) 找到目標node.
1.5.3.6.1.1.4 在目標node 的引入轉(zhuǎn)移屬性中,則將該transition,并將該transition的to 屬性設置為該目標node
1.5.3.6.1.1.5 在該轉(zhuǎn)移中,增加類型為“EVENTTYPE_TRANSITIOND”的事件,并增加事件的所有Action
1.5.3.6.1.1.6 在該轉(zhuǎn)移中,增加 違例處理器
1.5.3.7 解析 Action 的 Reference.找到每一個 設置了"ref-name"屬性的action,在processDefinition中,找到 ref-name 的值為名稱的action.并將該引用的action設置到原action中
1.5.3.8 校驗swimlane和assignment,如果某個 swimlane的assignment委托類為空,并且它不是StartTask的swimlane,則發(fā)出警告
1.5.3.9 如果 解析中產(chǎn)生了 級別為Error的 problem,則拋出違例
2.持久化流程定義
graphSession.saveProcessDefinition(processDefinition);
3.實例化流程實例 processInstance = new ProcessInstance(processDefinition);
3.1 記錄傳進來的流程定義
3.2 生成rootToken
3.2.1 記錄token開始時間
3.2.2 記錄流程實例
3.2.3 記錄該流程的StartState為該Token的node.
3.2.4 記錄該流程是否設置為隱式終止
3.3 記錄流程開始時間
3.4 查找所有“可選模塊”的定義,記錄可選模塊的實例??蛇x模塊 定義在 jbpm.default.modules.properties 中??蛇x模塊 構(gòu)成了 JBPM的可插入式架構(gòu)的機制。
3.5 使用配置好的 日志記錄模塊,記錄流程創(chuàng)建事件。
3.6 如果當前上下文下 有用于持久化的session,則持久化 流程實例
3.7 生成 ExecutionContext
3.8 發(fā)布流程啟動事件
3.8.1 在Log中記錄流程啟動事件 ,log.debug
3.8.2 在執(zhí)行環(huán)境 executionContext 中 設置事件源
3.8.3 發(fā)布并傳遞事件
3.8.3.1 判斷是否需要傳遞事件 如果事件源不是當前對象,則需要傳遞事件
3.8.3.2 執(zhí)行事件對應的靜態(tài)Action,找到流程定義中定義的類型為流程啟動的事件,并執(zhí)行定義中 該事件的Action.
3.8.3.2.1 找到流程定義時設定的 本流程元素中的給定類型的事件
3.8.3.2.2 執(zhí)行event對應的actions
3.8.3.2.2.1 遍歷所有Action
3.8.3.2.2.2 如果 本action接受其他 流程元素傳遞來的事件,或者 這不是一個傳遞來的事件 ,則執(zhí)行本action
3.8.3.2.2.3 創(chuàng)建Action log
3.8.3.2.2.4 增加ActionLog日志項到 LoggingInstance 中,同時聲明 該日志項,是一個組合日志的第一項
3.8.3.2.2.5 打印action執(zhí)行 的log, log.debug
3.8.3.2.2.6 執(zhí)行action
3.8.3.2.2.6.1 實例化 actionHandler
3.8.3.2.2.6.2 調(diào)用 actionHandler的execute方法
3.8.3.2.2.7 如果action執(zhí)行拋出了違例
3.8.3.2.2.7.1 log.error
3.8.3.2.2.7.2 使用違例處理器來處理違例
3.8.3.2.2.7.2.1 在該流程元素中,找到應該處理 給定 違例 的違例處理器
3.8.3.2.2.7.2.1.1 遍歷所有違例處理器,判斷每個違例處理器是否應該處理一個違例
3.8.3.2.2.7.2.2 請求該違例處理器處理違例
3.8.3.2.2.7.2.2.1 執(zhí)行該違例處理器的所有action
3.8.3.2.2.7.2.3 如果違例處理器 沒有處理成功,則請求該流程元素的父元素處理該違例,如果沒有父元素,則拋出一個缺省的委托類違例
3.8.3.2.2.8 執(zhí)行Action后,必須要做下面的收尾工作
3.8.3.2.2.7.1 將executionContext中的Action屬性置為空
3.8.3.2.2.7.2 標識 組合日志完成
3.8.3.3 執(zhí)行事件對應的動態(tài)Action,動態(tài)Action,為運行時增加到ProcessInstance中的,與某個事件對應。
3.8.3.4 如果本 圖元素的父元素存在,則調(diào)用父元素的 發(fā)布并傳遞事件 方法(參見上面的 3.8.3)。
3.8.4 在執(zhí)行環(huán)境中 清空事件源
4.持久化 流程實例
5.通過hibernate 從持久層 裝載4個對象實例
processDefinition = graphSession.loadProcessDefinition(processDefinition.getId());
processInstance = graphSession.loadProcessInstance(processInstance.getId());
contextInstance = processInstance.getContextInstance();
taskMgmtInstance = processInstance.getTaskMgmtInstance();
JBPM版本:3.0 beta1
作者:beehive.cn
版權(quán)所有:beehive.cn
查看更多JBPM源碼追蹤,請到
http://www.beehive.cn/modules/newbb/viewforum.php?forum=14
posted on 2007-07-11 14:07
大博的BLOG 閱讀(1237)
評論(0) 編輯 收藏 所屬分類:
jbpm