我設計的流程引擎是腳步驅動的。腳本中定義了流程執行的環境,流程操作的對象,流程執行的步驟。下面是一個流程腳本的示例:
<?xml version="1.0" encoding="utf-8"?>
<process name="make_call">
<data type="user_tel">called_number</data>
<object type="user" id="global_data:called_number" operation="must">obj_user</object>
//用戶對象描述中,號碼是必須的,是流程引擎和業務的交互唯一標識,callid是可選的。
<object type="user" object_num="global_data:called_number" operation="must">obj_user</object>
<sequence name="make_call">
<invoke interface="make_call" node="make_call_001" object_user="obj_user" calling_number="6699" original_number="123456" call_type="local_call">
</invoke>
<invoke interface="play_voice" node="play_voice_001" object_user="obj_user" play_long="100" play_file="/home/welcome.au">
</invoke>
</sequence>
</process>
腳本的含義 :
1、process的name屬性表示流程的名稱,用于在程序中調用。
2、<data type="user_tel">called_number</data>表示定義了一個流程的全局外部變量。有程序在調用流程是作為流程數據傳送給流程。這個數據要在后面的流程中使用。
3、<object>部分在流程中定義流程操作的對象。一般分為用戶和會場。這里表示是用戶。屬性“id”表示對象的唯一標識。這里引用的是流程的全局數據:global_data:called_number,也就是在上面定義的數據。屬性“operation”表示此對象是可選還是必選。如果是必須,這如果此對象被釋放,這流程也要被被結束。否則,不結束。中間的內容表示對象在流程中的唯一標示,這里是obj_user,后面的節點可以通過使用它來操作對象。
4、<sequence>表示順序調用下面的節點。
5、<invoke >表示調用節點。屬性“interface="make_call"”表示此節點調用的接口是make_call。make_call是在代碼中定義好的關鍵字,對應一個軟交換系統的接口。屬性“node”表示節點的唯一標識,在流程內部唯一,可以在流程跳轉的時候使用。 “object_user="obj_user"“表示make_call 接口操作的對象。有<object>創建。 calling_number="6699" original_number="123456" call_type="local_call"表示的是make_call接口調用時的數據。
6、<invoke interface="play_voice"表示對此對象進行放音。
這個腳本的意思是,根據流程輸入的號碼,創建用戶對象,并且發起呼叫,對用戶進行放音。
復雜的腳步定義:
上面的是一個簡單的示例。為了能夠實現流程編輯,要考慮很多的情況,要能夠進行分支處理,跳轉執行,捕獲事件等。
1、分支的實現
<recive event="user_key" ="" node="receive_key" object_user="obj_user" time_out="10"></recive>
<switch condition_type="user_key" object="obj_user">
<case condition="9092">
<sequence name="d">
</sequence>
</case>
<case condition="time_out">
<sequence name="d">
</sequence>
</case>
<otherwise>
<sequence name="">
<goto node="play_voice_001">goto_001</goto>
</sequence>
</otherwise>
</switch>
1)<recive event="user_key"表示接受指定用戶的按鍵。如果超過10秒為收到按鍵則認為用戶按鍵結束。
2)<switch condition_type="user_key"表示一用戶的按鍵為分支條件,進行分支處理。
3)<case condition="9092">表示如果用戶的按鍵式0092的話則進入此分支進行處理。
4)<case condition="time_out">如果超時為收到用戶按鍵,這進入此分支處理
5)<otherwise>如果上面的條件都不滿足,則進入此分支處理。
2、跳轉的實現:
<goto node="goto_001" next_node="play_voice_001"></goto>
表示此節點是一個跳轉節點,要跳轉到的下一個節點是play_voice_001。
3、信號捕獲的實現:
<pick name="pick_001" time_out="10">
<on_event event="on_ring_180" result="success" reason="normal">
<sequence name="008">
</sequence>
</on_event>
<time_out>
<sequence name="008">
</sequence>
</time_out>
<otherwise event="on_ring_180:on_ring_183">
<sequence name="009">
</sequence>
</otherwise>
</pick>
1)<pick name="pick_001" time_out="10"><pick>活動會等待一組相互排斥事件中的一個事件的發生,然后執行與發生的事件相關聯的活動。它會阻塞業務流程執行,以等待某一特定的事件發生,比如接收到一個合適的消息或超時警報響起。當其中任何一個事件被觸發后,業務流程就會繼續執行,pick也隨即完成了,不會再等待其他事件的發生。
2)<on_event event="on_ring_180" result="success" reason="normal">表示如果收到的on_ring_180,且結果是success,原因是normal。觸發此流程的處理。
3)<time_out>表示超時為收到制定事件的處理。
4)<otherwise event="on_ring_180:on_ring_183">表示收到其他的事件,比如:on_ring_180或on_ring_183,都進入此分支處理。