<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Junky's IT Notebook

    統計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    Work Flow 學習筆記(二)

    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(), 判斷該遷移是否在允許的設定內 ;

    posted on 2006-05-25 20:25 junky 閱讀(345) 評論(1)  編輯  收藏 所屬分類: Work Flow

    評論

    # re: Work Flow 學習筆記(二) 2006-08-08 17:06 afdgfd

    gfsdgsdfg  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 国产精品免费久久久久电影网| 无码免费一区二区三区免费播放 | 中文无码成人免费视频在线观看| 色五月五月丁香亚洲综合网| 亚洲一区二区三区丝袜| 亚洲一本之道高清乱码| 亚洲最大成人网色香蕉| 亚洲人色大成年网站在线观看 | 亚洲国产成人五月综合网| 国产乱子伦精品免费无码专区| 一级一级一片免费高清| 一区二区三区免费看| 99re6在线视频精品免费| 青柠影视在线观看免费| 亚欧日韩毛片在线看免费网站| 久久w5ww成w人免费| **毛片免费观看久久精品| 福利免费观看午夜体检区| 成年女人男人免费视频播放| 拔擦拔擦8x华人免费久久| 亚洲av无码专区在线观看素人| 国产亚洲成人在线播放va| 婷婷亚洲综合五月天小说| 亚洲精品资源在线| 久久久久久一品道精品免费看| 久久免费观看国产精品| 亚洲一级毛片免费看| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲中文无码mv| 国产亚洲成在线播放va| 国产区在线免费观看| 99免费观看视频| 成年女人午夜毛片免费看| 免费a在线观看播放| 亚洲精品无码午夜福利中文字幕| 337p日本欧洲亚洲大胆色噜噜| 亚洲va久久久久| 一级毛片a女人刺激视频免费| 无码一区二区三区免费| 亚洲国产日韩女人aaaaaa毛片在线| 免费观看国产小粉嫩喷水|