WfExecutionObject
WfExecutionObject
是一個抽象類
,
它定義了一些的共有的屬性和方法
;
該類的兩個主要派生類為
WfProcess
和
WfActivity;
它的執行步驟在介紹
WfProcess
和
WfActivity
時我在對其進行詳細說明
,
這里主要介紹一下它的主要屬性和方法
(
參考
ofbiz
實現
):
(1)
???
key()
方法
該方法返回當前可執行對象的唯一標識
,
這里主要是
WfProcess
和
WfActivity
的
id;
public String key() throws WfException {
??????? if (activityId != null)
??????????? return activityId;
??????? else
??????????? return processId;
}
(2)
???
processContext()
該方法用于獲取當前執行流程的相關數據
;
在可執行流程剛剛創建時
,
會把它所需的上下文信息
(
主要是名值對
)
以
xml
的格式保存到數據庫中
(RuntimeData);
這樣在運行時可以隨時從
RuntimeData
取出上下文信息
;
?
運行時的對象信息是保存在
WorkEffort
中
,
通過
WorkEffort
可以找到具體的
RuntimeData
數據
;
(3)
???
state
屬性
執行對象狀態
(
和
WfProcess
的流程狀態沒有關系
)
的演變是它的核心部分
;
各個狀態之間可以用一個層次結構來表示
;
?????????????
?????
????????
?
狀態組成圖
??????
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
??
?
從上面這張圖可以很方便的推出各種實現
,
比如當
open
狀態時候
,
我們可以知道目前只可有兩種狀態需要我們繼續關注
not_running
和
running,
實現代碼如下
??? public List whileOpenType() throws WfException {
??????? String[] list = {"running", "not_running"};
?
??????? return Arrays.asList(list);
}
另外一個重點就是狀態的演變
,
很顯然狀態的演變有一定的約束
;
比如它只能從
open->closed,
而不能反過來
;
另外
open
狀態下的子狀態又可以互相進行演變
;
狀態遷移圖如下
?????????????????????
?
狀態遷移圖
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
從上圖我們可以根據當前執行對象的狀態推出可以演變的子狀態集合
;
比如如當前狀態為
open.running,
那么它可以遷移的子狀態有
open.not_running.suspended
以及
closed
下的三個子狀態
closed.completed,closed.terminated,closed.aborted,
而不能遷移到
open.not_running.not_started
狀態
;
需要說明的一點是
,
按照
WF
規范遷移到
closed
狀態
,
是指可以演變到
closed
下面三個子狀態的任何其中一個去
,
但不同的實現卻可以根據具體情況來進行設定
;
比如
ofbiz
的實現中
,not_started
和
suspended
狀態只能遷移到
closed
下的
aborted,
而不能遷移到
completed
和
teminated
狀態下
;
根據當前狀態獲取可以下一步的子狀態集合功能就是
validStates()
方法的實現了
;
(4)validStates()
根據當前狀態獲取可以下一步的子狀態集合
,
從上面的遷移圖我們可以很容易實現該方法
;
如下為
ofbiz
的參考實現
public List validStates() throws WfException {
??????? String statesArr[] = {"open.running", "open.not_running.not_started", "open.not_running.suspended",
??????????????? "closed.completed", "closed.terminated", "closed.aborted"};
??????? ArrayList possibleStates = new ArrayList(Arrays.asList(statesArr));
??????? String currentState = state();
?
??????? if (currentState.startsWith("closed"))
??????????? return new ArrayList();
??????? if (!currentState.startsWith("open"))
??????????? throw new WfException("Currently in an unknown state.");
??????? if (currentState.equals("open.running")) {
??????????? possibleStates.remove("open.running");
??????????? possibleStates.remove("open.not_running.not_started");
??????????? return possibleStates;
??????? }
??????? if (currentState.equals("open.not_running.not_started")) {
??????????? possibleStates.remove("open.not_running.not_started");
??????????? possibleStates.remove("open.not_running.suspended");
??????????? possibleStates.remove("closed.completed");
??????????? possibleStates.remove("closed.terminated");???????????
??????????? return possibleStates;
??????? }
??????? if (currentState.equals("open.not_running.suspended")) {
??????????? possibleStates.remove("open.not_running.suspended");
??????????? possibleStates.remove("open.not_running.not_started");
??????????? possibleStates.remove("closed.complete");
??????????? possibleStates.remove("closed.terminated");???????????
??????????? return possibleStates;
??????? }
??????? return new ArrayList();
}
(5)changeState(String state)
該方法的功能比較簡單
,
就是根據指定的狀態進行狀態的遷移
;
需要注意的是在狀態轉變前必須調用上面的
validStates(),
判斷該遷移是否在允許的設定內
;