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

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

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

    莊周夢蝶

    生活、程序、未來
       :: 首頁 ::  ::  :: 聚合  :: 管理

    寫一個簡單的工作流(二)

    Posted on 2007-10-11 16:51 dennis 閱讀(558) 評論(0)  編輯  收藏 所屬分類: javamy open-source
        hoho,今天完成了選擇路由的實現,完成了配置文件的讀寫和解析,流程定義文件還是決定采用xml文件,不過與其他工作流引擎采用的xml完全不同,因為是基于petri網的,因此引入了place的概念,比如下面這個4個節點的順序路由的流程:
    <workflow maxCases="100">
        
    <node type="start" name="start" id="0">
            
    <inputs>
                
    <place id="1" />
            
    </inputs>
            
    <outputs>
                
    <place id="2" />
            
    </outputs>
        
    </node>
        
    <node name="hello" id="1" resource="user">
            
    <conditions type="and">
                
    <condition
                    
    class="net.rubyeye.insect.workflow.impl.NullHandler" value="false"
                    variable-name
    ="name" />
            
    </conditions>
            
    <handler
                
    class="net.rubyeye.insect.workflow.test.HelloWorldHandler" />
            
    <inputs>
                
    <place id="2" />
            
    </inputs>
            
    <outputs>
                
    <place id="3" />
            
    </outputs>
        
    </node>
        
    <node name="calc" id="2" resource="user">
            
    <conditions type="and">
                
    <condition variable-name="num">
                    
    <exp>
                        
    <![CDATA[num<=1000]]>
                    
    </exp>
                
    </condition>
                
    <conditions type="or">
                    
    <condition variable-name="num">
                        
    <exp>
                            
    <![CDATA[num>=10]]>
                        
    </exp>
                    
    </condition>
                    
    <condition
                        
    class="net.rubyeye.insect.workflow.impl.NullHandler" value="false"
                        variable-name
    ="name" />
                
    </conditions>
            
    </conditions>
            
    <handler
                
    class="net.rubyeye.insect.workflow.test.CalculateHandler" />
            
    <inputs>
                
    <place id="3" />
            
    </inputs>
            
    <outputs>
                
    <place id="4" />
            
    </outputs>
        
    </node>
        
    <node type="end" name="hello" id="3">
            
    <inputs>
                
    <place id="4" />
            
    </inputs>
            
    <outputs>
                
    <place id="5" />
            
    </outputs>
        
    </node>
    </workflow>
       
    并行路由和選擇路由引入了and-split,and-join,or-split,or-join四種transition,比如and-split,它就有多個輸出place:

    <node name="split" type="and-split" id="1" resource="user">
            
    <inputs>
                
    <place id="2" />
            
    </inputs>
            
    <outputs>
                
    <place id="3" />
                
    <place id="4" />
            
    </outputs>
        
    </node>

       Place和Transition都有條件,用于決定操作是否執行,Transition額外指定了驅動的資源以及回調的handler,這一點非常重要,資源可能是用戶、用戶組、某個時間點定時事件、特定消息等等。
       今天額外發現的一個好處就是,引入Place之后,我可以輕易地將不同的流程連接起來組織成一個更復雜的流程,僅僅是需要修改各個流程的開始和結束的節點的輸入輸出庫所,從而實現了層次化的Petri網,,類似代碼:
    WorkFlow sequence = wm.getWorkFlow("sequence");
            WorkFlow concurrency 
    = wm.getWorkFlow("concurrency");
            WorkFlow choose 
    = wm.getWorkFlow("choose");

            
    //組合流程
            composite = new WorkFlow();
            composite.setName(
    "composite");
            composite.setId(
    100);
            
            wm.saveWorkFlow(composite);

            
    //修改開始結束節點的輸入輸出庫所
            sequence.getEnd().setType(TransitionType.NORMAL);
            sequence.getEnd().setOutputs(concurrency.getStart().getInputs());

            concurrency.getEnd().setType(TransitionType.NORMAL);
            concurrency.getEnd().setOutputs(choose.getStart().getInputs());
            
            composite.setStart(sequence.getStart());
            composite.setEnd(choose.getEnd());
            List
    <Transition> transitions = new ArrayList<Transition>();
            transitions.addAll(sequence.getTransitions());
            transitions.addAll(concurrency.getTransitions());
            transitions.addAll(choose.getTransitions());
            composite.setTransitions(transitions);




    主站蜘蛛池模板: 全免费a级毛片免费看无码| 日本亚洲成高清一区二区三区| 自拍偷自拍亚洲精品偷一| 亚洲福利精品电影在线观看| 免费无码又爽又刺激网站直播| 亚洲一区二区三区夜色| 免费看大美女大黄大色| 中文字幕免费观看全部电影| 亚洲一区二区三区久久| 亚洲国产婷婷香蕉久久久久久| 日本在线看片免费人成视频1000| 亚洲av成人一区二区三区在线播放| 中文字幕人成人乱码亚洲电影 | 亚洲国模精品一区| 99re在线精品视频免费| 免费视频成人国产精品网站| 亚洲美女视频一区二区三区| 成人伊人亚洲人综合网站222| 亚洲美女免费视频| 一区二区免费电影| 亚洲乱亚洲乱妇无码| 久久久久久亚洲精品| 国产性生交xxxxx免费| 亚洲成人免费电影| 本道天堂成在人线av无码免费| 亚洲偷偷自拍高清| 亚洲AV日韩AV永久无码下载| yy6080久久亚洲精品| 最近最好的中文字幕2019免费| 日本免费A级毛一片| 日韩毛片在线免费观看| 国产亚洲精品bv在线观看| 亚洲高清专区日韩精品| 亚洲国产精品自在拍在线播放| 欧洲黑大粗无码免费| 99re在线精品视频免费| 国产免费网站看v片在线| 无码AV动漫精品一区二区免费| 亚洲老熟女五十路老熟女bbw| 亚洲欧洲校园自拍都市| 亚洲国产精品国自产拍电影|