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

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

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

    莊周夢(mèng)蝶

    生活、程序、未來(lái)
       :: 首頁(yè) ::  ::  :: 聚合  :: 管理

    寫一個(gè)簡(jiǎn)單的工作流(二)

    Posted on 2007-10-11 16:51 dennis 閱讀(558) 評(píng)論(0)  編輯  收藏 所屬分類: javamy open-source
        hoho,今天完成了選擇路由的實(shí)現(xiàn),完成了配置文件的讀寫和解析,流程定義文件還是決定采用xml文件,不過(guò)與其他工作流引擎采用的xml完全不同,因?yàn)槭腔趐etri網(wǎng)的,因此引入了place的概念,比如下面這個(gè)4個(gè)節(jié)點(diǎn)的順序路由的流程:
    <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,它就有多個(gè)輸出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都有條件,用于決定操作是否執(zhí)行,Transition額外指定了驅(qū)動(dòng)的資源以及回調(diào)的handler,這一點(diǎn)非常重要,資源可能是用戶、用戶組、某個(gè)時(shí)間點(diǎn)定時(shí)事件、特定消息等等。
       今天額外發(fā)現(xiàn)的一個(gè)好處就是,引入Place之后,我可以輕易地將不同的流程連接起來(lái)組織成一個(gè)更復(fù)雜的流程,僅僅是需要修改各個(gè)流程的開始和結(jié)束的節(jié)點(diǎn)的輸入輸出庫(kù)所,從而實(shí)現(xiàn)了層次化的Petri網(wǎng),,類似代碼:
    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);

            
    //修改開始結(jié)束節(jié)點(diǎn)的輸入輸出庫(kù)所
            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);




    主站蜘蛛池模板: 最近最新高清免费中文字幕| 91亚洲一区二区在线观看不卡| 3d成人免费动漫在线观看| 91成人免费观看网站| 国产亚洲中文日本不卡二区| 亚洲AV无码一区二区乱子伦| 蜜桃视频在线观看免费网址入口| 亚洲国产成a人v在线观看| 亚洲国产精品激情在线观看| 亚洲AV永久无码精品一区二区国产| 亚洲精品二三区伊人久久| 国产亚洲精品AA片在线观看不加载| 亚洲AV无码专区在线观看成人| 亚洲无码视频在线| 爽爽日本在线视频免费| 亚洲精品成人a在线观看| 免费毛片在线播放| 亚洲片一区二区三区| 久久亚洲高清综合| 亚洲精品免费视频| 亚洲精品无码AV人在线播放| 国产亚洲精品资在线| 91视频免费观看高清观看完整| 亚洲国产成人久久综合野外| 亚洲图片中文字幕| 国产免费A∨在线播放| 成人午夜大片免费7777| 无码欧精品亚洲日韩一区| 亚洲色无码国产精品网站可下载| 亚洲人成网站色7799| 免费无码A片一区二三区| 亚洲国产精品无码中文字| 亚洲理论片中文字幕电影| 久久亚洲国产精品| 亚洲国产成人精品激情| 不卡精品国产_亚洲人成在线| 人妻在线日韩免费视频| 又黄又爽的视频免费看| 99久久99久久免费精品小说| 免费一级毛片一级毛片aa| 久操免费在线观看|