JBPM時間服務的使用主要體現在對timer節點的使用。timer節點有兩種使用方式:一種是掛接到node節點下,在進入node節點時觸發,在離開node節點時終止;另外一種是掛接到task節點下,在任務創建時觸發,默認在任務完成后終止。下面舉例說明:
一、掛接到node節點
<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將會在流程令牌進入節點catch crooks時觸發,延遲3 business hours開始執行動作,每10 business minutes重復執行一次,直到令牌離開catch crooks節點。
對time節點來說 name、repeat、transition都是可選屬性。對一個流程定義來說,每一個time節點的name必須唯一,如果你不定義name屬性,引擎會默認把node節點的name賦給timer。在上面這個例子里,如果你不定義timer節點的name,則它的name就會是catch crooks。說說repeat屬性,如果你不定義它,則timer就會只執行一次動作不會重復執行。transition屬性,如果定義了這個屬性,流程令牌會在timer執行動作完畢后,順著這個路徑離開node節點。所以在上面這個例子里,盡管定義了repeat屬性,action還是會只執行一次。
action節點,可選,即timer節點在時間到時執行的動作,可以是任意action類型,包括script。注意與時間有關的兩種action類型:create-timer 和 cancel-timer。其實一個timer節點在被引擎解釋時就是被分解為create-timer 和 cancel-timer兩個action,create-timer掛接到node-enter事件中,cancel-timer掛接到node-leave事件中。action節點最多只可以掛一個。
說說整個過程:
1、令牌進入節點catch crooks
2、timer被觸發(實際這時是在執行create-timer動作)
3、3 business hours后 timer 事件觸發
4、定義的action被執行
5、令牌順著time-out-transition路徑離開catch crooks節點
6、cancel-timer動作被執行即timer終止(沒有給repeat的機會)
二、掛接到task節點
<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 的區別是:這里可以定義一個屬性cancel-event,可以指定那些事件可以終止timer的執行,默認是task-end。可以指定多個事件,以','分割,任一事件觸發timer即終止。
可以看到jbpm對任務實例和節點執行時的時間服務還是支持的很好,可以做出很多的擴展,但是它沒有對整個流程實例本身提供更多的服務,比如說定時的流程啟動和整個流程的時間控制等等。以及對精確時間點的支持還不夠。
http://www.tkk7.com/ronghao 榮浩原創,轉載請注明出處:)
posted on 2007-06-21 12:00
ronghao 閱讀(1728)
評論(2) 編輯 收藏 所屬分類:
工作流jbpm3