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

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

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

    posts - 18,  comments - 0,  trackbacks - 0

    osworkflow中有關工作流流轉的所有核心代碼都在AbstractWorkflow中,BasicWorkflow就是派生自它,不過這個BasicWorkflow基本上沒做什么事情。也許我們還可以從AbstractWorkflow派生自己的Workflow類以加入擴展功能,大概這也算是osworkflow所體現的一種靈活性了,即:允許對工作流流轉的執行邏輯進行修改。AbstractWorkflow實現了Workflow接口,該接口包含了有關工作流的核心方法,最重要的是doAction方法,AbstractWorkflow實現了該方法,后面會提及,其他還有一些getter和query method。

    流程流轉的執行邏輯>>

    當流程執行到的某個step時,可能有一個或多個action可供用戶選擇執行。一旦確定執行某個action后,我們需要調用AbstractWorkflow.doAction,并傳入流程id和action的id。以下是對doAction的執行邏輯的一個不太嚴緊的算法描述:

    *  *  *

    -  根據流程id,獲得所有當前的step,這種情況往往發生在有split的時候,此時會有多個step等待執行;
    -  根據傳入的action的id,檢查是否是global action;
    -  若不是global action,則遍歷所有當前的step,對每個step的每個action調用isActionAvailable方法,檢查該action是否可用(記住step和action是一對多的關系);
    -  所謂可用是指,通過執行passesConditions,逐個檢查action的condition:若是OR的關系,則有一個condition為真即為可用,AND關系則類推;
    -  若action可用,則調用transitionWorkflow,這是流程流轉處理的關鍵部分;
     執行transitionWorkflow時:
     -  首先獲取當前step,存在有多個當前step的情況,比如split,此時獲取首個isAvailableAction為真的step;
     -  調用verifyInputs驗證輸入(如果action有validator的話);
     -  執行當前step的post function(因為該step即將結束);
     -  執行action的pre function;
     -  判斷當前step所屬的result中的所有condition是否滿足要求,判斷方法類似action的condition;
     -  一旦滿足,則獲取result的pre function和post function;
     -  否則即是unconditional result,獲取相應的pre function和post function;
     -  在沒有split和join的情況下
      -  會根據在result中指定的下一個step的id,創建一個新的step,作為當前的step;
      -  從current steps中移除原來的當前step,并添加到history steps中;
      -  如果新的step有pre function,則會馬上執行;
     -  執行result的post function;
     -  執行action的post function;
     -  若action是intial action,則將流程設置為activated狀態;
     -  若action是finish action,則將流程設置為completed狀態,返回true;
     -  尋找auto action,若有的話,則執行之,執行方法是調用doAction本身;
     -  返回false;
    -  根據transitionWorkflow的返回值判斷流程是否結束;
    -  若返回false,則調用checkImplicitFinish檢查是否存在implicit finish,即:當前沒有一個step的action可用時,就認為流程應該結束;

    *  *  *

    - 若存在split,則會創建多個新的step,并且在創建之前先執行split的pre function,在創建之后執行split的post function;
    - 創建step的過程和上面描述的普通狀況相同:維護好current steps和history steps,并執行新的step的pre function;

    *  *  *

    - 若存在join,先結束當前step,并將該step添加至history steps和join steps;
    - 查找history steps,對每個已完成的step,查看是否在其result或unconditional result中有join一項,若有則加入join steps中;
    - 檢查join是否已經滿足:可以使用Bean Shell,在xml定義文件的join節點中,通過引用一個名為“jn”的特殊變量來指定join的滿足條件,jn記錄了有關join的關鍵信息;
    - 若條件滿足,則執行join的pre function,維護好history steps,并創建下一個step,然后執行join的post function;

    *  *  *

    - 對于條件循環的情況,可以通過將result的某個action的下一個step指定為自身來加以實現,這只是在xml定義文件中做文章,流程執行邏輯無需做特殊處理;

    posted on 2006-04-22 20:35 LORD BLOG 閱讀(306) 評論(0)  編輯  收藏 所屬分類: WorkFlow

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲AV无码成H人在线观看| 久久久久久99av无码免费网站| 免费一级做a爰片久久毛片潮喷| 亚洲av一本岛在线播放| 久草视频在线免费| 亚洲视频在线一区二区三区| 91香蕉国产线观看免费全集| 久久久久亚洲精品无码蜜桃 | 亚洲Aⅴ无码专区在线观看q| a级在线免费观看| 亚洲精品高清久久| 亚州免费一级毛片| 亚洲AV一二三区成人影片| 毛片免费观看网站| 偷自拍亚洲视频在线观看99| 婷婷亚洲天堂影院| 国产精品福利片免费看| 亚洲宅男天堂在线观看无病毒| 中文字幕乱码系列免费| 亚洲国产成人爱av在线播放| 亚洲国产精品久久久久秋霞小| 最新69国产成人精品免费视频动漫 | 先锋影音资源片午夜在线观看视频免费播放| 国产亚洲欧洲Aⅴ综合一区 | 免费精品人在线二线三线区别| 亚洲精品无码久久| 亚洲人午夜射精精品日韩| 成人爽a毛片免费| 亚洲 欧洲 视频 伦小说| 国产国产人免费人成免费视频 | 午夜亚洲国产成人不卡在线| 国产97视频人人做人人爱免费| 亚洲成AV人片天堂网无码| 久久不见久久见中文字幕免费 | 亚洲成av人影院| 中文字幕无码免费久久99| 国产偷国产偷亚洲高清在线| 亚洲精品乱码久久久久久久久久久久 | 亚洲激情视频在线观看| 破了亲妺妺的处免费视频国产| 中文字幕一区二区三区免费视频|