我設計的流程引擎是腳步驅動的。腳本中定義了流程執行的環境,流程操作的對象,流程執行的步驟。下面是一個流程腳本的示例:

          <?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,都進入此分支處理。

          posts - 19, comments - 0, trackbacks - 0, articles - 0

          Copyright © 常高偉

          主站蜘蛛池模板: 日喀则市| 德保县| 和林格尔县| 龙海市| 沾化县| 长泰县| 永昌县| 新昌县| 托里县| 桃源县| 洛川县| 嵊泗县| 开封市| 永寿县| 乌兰察布市| 靖宇县| 抚州市| 蓬溪县| 湄潭县| 互助| 道真| 灵武市| 宜兰县| 徐水县| 英吉沙县| 富民县| 柳州市| 舞阳县| 怀远县| 汉中市| 商河县| 石景山区| 秦安县| 泰宁县| 开远市| 太谷县| 祁门县| 沾益县| 应用必备| 吴江市| 老河口市|