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

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

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

    零全零美(www.zzgwt.com)
    生活中的很多事情,并不像If...Else那么簡單!
    posts - 96,comments - 52,trackbacks - 0
          Fork節點在整個JBPM流程運轉過程中配合Join使用提供使多于一個的節點如:TaskNode、State等并行運行的作用,很可惜我們不能利用Fork提供的現有機制實現需求中經常遇到的并發子流程的效果,當然雖然JBPM并不支持并發子流程的機制,并不代表我們不能變通的實現,我將在另一篇文章中詳細說明我的并發子流程的實現方式
          Fork類的注釋中說:if this fork behaviour is not sufficient for your needs, consider writing your own custom TokenHandler.看來連JBPM開發小組也意識到Fork可能不能滿足某些特殊的需求。注釋中還說Fork節點有三種配置方式,我很奇怪為什么代碼中只能找到兩種:
                1、without configuration : in that case the fork will launch one new sub-token over each of the leaving tranisions of the fork node.
                2、a script : can be used to calculate a collection of transition names at runtime. if a script is configured, the script must have exactly one variable with 'write' access. that variable should be assigned a java.util.Collection in the script expression.
         Fork類繼承自Node并實現了Parsable接口。Fork類相對簡單,他的私有成員變量只有一個:
    1/**
    2       * a script that calculates the transitionNames at runtime.
    3       */

    4      Script script = null;
            
            Fork中的Script可以在運行時對Fork節點選擇Transition,所以在實際應用中可以使用Fork+Script的方式進行多路路由選擇.但是有一點要特別注意:JBBM User Guide文檔中說:the script in a fork is not persisted.  script in fork might be removed in later versions of jPDL,原本以為這句話的前半句是說Script不會被持久化進數據庫,實驗了才知道其實Script還是被存進了數據庫,這半句的意思應該是說"fork中的script不被堅持",JBPM開發小組要在新版本中放棄Script,我相信他們一定會提供更好的解決方案,讓我們拭目以待。 Fork重寫了Node類的read(Element forkElement, JpdlXmlReader jpdlReader)方法,其主要作用是解析JPDL中Fork節點Script的配置,并初始化自己的成員變量script。下面是execute(ExecutionContext executionContext)方法中的相關處理

     1Token token = executionContext.getToken();
     2        // 聲明離開轉向的集合
     3        Collection transitionNames = null;
     4        //聲明子Token容器
     5        List forkedTokens = new ArrayList();
     6
     7        // 如果沒有Script,默認按照其父類Node的getLeavingTransitionsMap取得所有離開轉向
     8        if (script == null{
     9            transitionNames = getLeavingTransitionsMap().keySet();
    10        }
     else 
    11            //如果有Script,按照規范該Script應該返回一個Collection類型的數據,作為Fork的離開轉向集合
    12            Map outputMap = null;
    13            try {
    14                //執行Script,得到返回的Collection數據
    15                outputMap = script.eval(token);
    16            }
     catch (Exception e) {
    17                this.raiseException(e, executionContext);
    18            }

    19            if (outputMap.size() == 1{
    20                Object result = outputMap.values().iterator().next();
    21                if (result instanceof Collection) {
    22                    transitionNames = (Collection) result;
    23                }

    24            }

    25            if (transitionNames == null{
    26                throw new JbpmException("script for fork '" + name + "' should produce one collection (in one writable variable): " + transitionNames);
    27            }

    28        }

    下面讓我們來看一下,Fork產生的子Token的命名方式:
     1    /**
     2     * 功能描述:為子Token取名字<BR>
     3     * @param parent 父Token
     4     * @param transitionName 離開轉向的名字
     5     */

     6    protected String getTokenName(Token parent, String transitionName) {
     7        String tokenName = null;
     8        //如果transitionName不為空
     9        if (transitionName != null{
    10            //如果父Tokehn中不存在以transitionName命名的子Token
    11            if (!parent.hasChild(transitionName)) {
    12                //以transitionName的名字為子Token命名
    13                tokenName = transitionName;
    14            }
     else {
    15                //如果已經存在則以transitionName+2的方式命名
    16                int i = 2;
    17                tokenName = transitionName + Integer.toString(i);
    18                //如果加2之后依然存在,開始循環,直到父Token中不存在相同名稱的子Token
    19                while (parent.hasChild(tokenName)) {
    20                    i++;
    21                    tokenName = transitionName + Integer.toString(i);
    22                }

    23            }

    24        }
     else {
    25            //如果transitionName為空,則判但父Token中是否有子Token,如果有則以parent.getChildren().size() + 1法命名,
    26            //如果沒有直接命名為1
    27            int size = (parent.getChildren() != null ? parent.getChildren().size() + 1 : 1);
    28            tokenName = Integer.toString(size);
    29        }

    30        return tokenName;
    31    }

    名字定好之后,Fork為每個離開轉向分別創建了一個子Token,加入一開始創建的forkedTokens中。最后開始循環列表,執行Node的leave方法,并觸發Node-leave事件
    iter = forkedTokens.iterator();
            
    while (iter.hasNext()) {
                ForkedToken forkedToken 
    = (ForkedToken) iter.next();
                Token childToken 
    = forkedToken.token;
                String leavingTransitionName 
    = forkedToken.leavingTransitionName;
                ExecutionContext childExecutionContext 
    = new ExecutionContext(childToken);
                
    if (leavingTransitionName != null{
                    leave(childExecutionContext, leavingTransitionName);
                }
     else {
                    leave(childExecutionContext);
                }

            }
            
            看了這段代碼我們應該明白:Fork的Node-leave事件是會執行多遍的,具體要看產生的子Token的個數.至于ForkedToken類,其實是Fork的一個內被類,只起到一個普通Bean的作用.
      到這里,Fork類的大體內容我們已經解讀完畢,但是還有一點要注意的地方:
       add some way of blocking the current token here and disable that blocking when the join reactivates this token Then an exception can be thrown by in case someone tries to signal a token that is waiting in a fork.Suspend and resume can NOT be used for this since that will also suspend any related timers, tasks and messages...So a separate kind of blocking should be created for this.

            文章原創,轉載請注明出處!
    posted on 2008-11-05 16:41 零全零美 閱讀(2107) 評論(0)  編輯  收藏 所屬分類: jbpm
    主站蜘蛛池模板: 91精品啪在线观看国产线免费| 国产偷国产偷亚洲清高APP| 在线观看人成视频免费无遮挡| 成人亚洲网站www在线观看| 亚洲国产高清国产拍精品| 成年大片免费视频| 亚洲精品V天堂中文字幕| 日本高清色本免费现在观看| 国产精品无码亚洲精品2021| 国产zzjjzzjj视频全免费 | 亚洲国产综合精品| 午夜国产精品免费观看| 亚洲无吗在线视频| 在线a毛片免费视频观看| 极品色天使在线婷婷天堂亚洲| 国产自产拍精品视频免费看| 日本激情猛烈在线看免费观看| 久久久久国产成人精品亚洲午夜 | 好吊妞在线新免费视频| 亚洲欧洲精品成人久久曰| 国产人妖ts在线观看免费视频| 一级特黄色毛片免费看| 亚洲人成电影在在线观看网色 | 午夜爱爱免费视频| 日韩色视频一区二区三区亚洲| 亚洲成?v人片天堂网无码| 免费观看男人吊女人视频| 亚洲国产精品人久久电影| 国产一卡二卡≡卡四卡免费乱码| 国产97视频人人做人人爱免费| 亚洲avav天堂av在线不卡| 好爽…又高潮了免费毛片| 在线看片免费人成视频久网下载| 亚洲电影在线免费观看| 日本免费中文字幕在线看| a级午夜毛片免费一区二区| 亚洲人精品亚洲人成在线| 国产亚洲?V无码?V男人的天堂 | 国产亚洲无线码一区二区 | 最好免费观看韩国+日本 | 久久99国产乱子伦精品免费|