posts - 18,  comments - 0,  trackbacks - 0
          公告
          這個世界的美麗在于變化
          而一個人的美麗在于奮斗
          ......
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞檔案

          相冊

          JAVA網址

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

          流程流轉的執(zhí)行邏輯>>

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

          *  *  *

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

          *  *  *

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

          *  *  *

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

          *  *  *

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 兴化市| 宁海县| 镇赉县| 辽中县| 溧水县| 宁安市| 九江市| 上虞市| 津市市| 遂川县| 九龙城区| 扎鲁特旗| 无棣县| 梨树县| 通渭县| 桃江县| 偏关县| 富顺县| 翁牛特旗| 彝良县| 莱西市| 客服| 霞浦县| 读书| 婺源县| 黔西县| 万荣县| 石首市| 波密县| 临西县| 昌黎县| 淮安市| 黄陵县| 柯坪县| 公主岭市| 邯郸市| 铅山县| 定南县| 浙江省| 万山特区| 旬阳县|