JBPM時(shí)間服務(wù)的使用主要體現(xiàn)在對(duì)timer節(jié)點(diǎn)的使用。timer節(jié)點(diǎn)有兩種使用方式:一種是掛接到node節(jié)點(diǎn)下,在進(jìn)入node節(jié)點(diǎn)時(shí)觸發(fā),在離開(kāi)node節(jié)點(diǎn)時(shí)終止;另外一種是掛接到task節(jié)點(diǎn)下,在任務(wù)創(chuàng)建時(shí)觸發(fā),默認(rèn)在任務(wù)完成后終止。下面舉例說(shuō)明:
一、掛接到node節(jié)點(diǎn)
<state name='catch crooks'>
<timer name='reminder'
duedate='3 business hours'
repeat='10 business minutes'
transition='time-out-transition' >
<action class='the-remainder-action-class-name' />
<transition name='time-out-transition' to='next' />
</timer>
</state>
解釋:timer將會(huì)在流程令牌進(jìn)入節(jié)點(diǎn)catch crooks時(shí)觸發(fā),延遲3 business hours開(kāi)始執(zhí)行動(dòng)作,每10 business minutes重復(fù)執(zhí)行一次,直到令牌離開(kāi)catch crooks節(jié)點(diǎn)。
對(duì)time節(jié)點(diǎn)來(lái)說(shuō) name、repeat、transition都是可選屬性。對(duì)一個(gè)流程定義來(lái)說(shuō),每一個(gè)time節(jié)點(diǎn)的name必須唯一,如果你不定義name屬性,引擎會(huì)默認(rèn)把node節(jié)點(diǎn)的name賦給timer。在上面這個(gè)例子里,如果你不定義timer節(jié)點(diǎn)的name,則它的name就會(huì)是catch crooks。說(shuō)說(shuō)repeat屬性,如果你不定義它,則timer就會(huì)只執(zhí)行一次動(dòng)作不會(huì)重復(fù)執(zhí)行。transition屬性,如果定義了這個(gè)屬性,流程令牌會(huì)在timer執(zhí)行動(dòng)作完畢后,順著這個(gè)路徑離開(kāi)node節(jié)點(diǎn)。所以在上面這個(gè)例子里,盡管定義了repeat屬性,action還是會(huì)只執(zhí)行一次。
action節(jié)點(diǎn),可選,即timer節(jié)點(diǎn)在時(shí)間到時(shí)執(zhí)行的動(dòng)作,可以是任意action類型,包括script。注意與時(shí)間有關(guān)的兩種action類型:create-timer 和 cancel-timer。其實(shí)一個(gè)timer節(jié)點(diǎn)在被引擎解釋時(shí)就是被分解為create-timer 和 cancel-timer兩個(gè)action,create-timer掛接到node-enter事件中,cancel-timer掛接到node-leave事件中。action節(jié)點(diǎn)最多只可以掛一個(gè)。
說(shuō)說(shuō)整個(gè)過(guò)程:
1、令牌進(jìn)入節(jié)點(diǎn)catch crooks
2、timer被觸發(fā)(實(shí)際這時(shí)是在執(zhí)行create-timer動(dòng)作)
3、3 business hours后 timer 事件觸發(fā)
4、定義的action被執(zhí)行
5、令牌順著time-out-transition路徑離開(kāi)catch crooks節(jié)點(diǎn)
6、cancel-timer動(dòng)作被執(zhí)行即timer終止(沒(méi)有給repeat的機(jī)會(huì))
二、掛接到task節(jié)點(diǎn)
<task-node name="Evaluate web order">
<task swimlane="salesman">
<timer duedate="20 seconds" repeat="10 seconds" cancel-event='task-start'>
<action class="org.jbpm.websale.RemindActor">
<swimlaneName>salesman</swimlaneName>
</action>
</timer>
</task>
<transition name="OK" to="salefork" />
<transition name="More info needed" to="Fix web order data" />
</task-node>
與掛接到node 的區(qū)別是:這里可以定義一個(gè)屬性cancel-event,可以指定那些事件可以終止timer的執(zhí)行,默認(rèn)是task-end。可以指定多個(gè)事件,以','分割,任一事件觸發(fā)timer即終止。
可以看到j(luò)bpm對(duì)任務(wù)實(shí)例和節(jié)點(diǎn)執(zhí)行時(shí)的時(shí)間服務(wù)還是支持的很好,可以做出很多的擴(kuò)展,但是它沒(méi)有對(duì)整個(gè)流程實(shí)例本身提供更多的服務(wù),比如說(shuō)定時(shí)的流程啟動(dòng)和整個(gè)流程的時(shí)間控制等等。以及對(duì)精確時(shí)間點(diǎn)的支持還不夠。
http://www.tkk7.com/ronghao 榮浩原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:)
posted on 2007-06-21 12:00
ronghao 閱讀(1722)
評(píng)論(2) 編輯 收藏 所屬分類:
工作流jbpm3