Posted on 2007-10-11 16:51
dennis 閱讀(558)
評(píng)論(0) 編輯 收藏 所屬分類:
java 、
my 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);