From: http://yate.null.ro/pmwiki/index.php?n=Main.Messages
消息是YATE的一個主要組成部分。所有的模塊間通信都使用消息而不使用函數調用,這主要是因爲我們考慮當一個模塊發生變化的時候不影響或不依賴於其他模塊,也因爲我們知道模塊直接傳遞的參數,使得我們的調試模塊可以更容易些。
一個消息由以下幾個部分組成:
* 名字(name)——消息類型的標識,允許消息處理器通過名字進行匹配
* 返回值(return value)—— 一個用字符串表示的處理消息之後的返回值
* 時間(time)—— 消息被創建的時間;這對於排隊的消息檢查等待時長非常重要
* 參數(parameters)—— 可能有多個或0個參數組成,每個參數由名稱、值對構成。每個處理器都能根據參數進行不同的動作,或者修改參數本身。不知道的參數必須忽略。
所有的消息在YATE內部是二進制形式的。然而我們可以通過rmanager模塊提供一個對人可讀的形式。
YATE內部消息傳遞通過內存共享(memory sharing)。在這種方式下,可以提高系統的性能。其他可以考慮的形式如管道或Sockets,沒有內存共享靈活和高效。
當被傳遞到外部模塊(external modules)時,消息被轉換成字符串編碼的形式,這樣所有能處理文本的外部模塊都可以處理消息了。 可參考文檔external module,
獲取更多詳細信息。
消息由消息處理器處理,每個消息處理器僅處理與它名字相同的消息。他們可以任意修改消息元素(參數,返回值,甚至消息名稱),一個消息處理器處理完之後,可
由下一個消息處理器處理。
消息處理器處理消息的順序,再插入派發器中就已經決定。處理順序按照消息處理器的優先級決定,優先級值越低的預處理器優先級越高,先與優先級值高的接受到消息。
對於相同優先級的消息處理器,調用順序是不確定的。調用順序按以下的規則:
*同名的消息調用順序是不會改變的
*爲了避免不確定性,如果消息處理器被移除,並插入一個同等優先級的消息處理器,則他們的順序由她的的內存地址決定。
以下是“call.rotue”在消息系統重的工作過程例子
當某個電話打來時,消息是這樣產生的:
然後我們將消息發送給引擎,檢查是否有模塊(module)接收並處理了,最後必須將消息銷燬。
引擎在得到上述消息,將其發送到所有註冊名爲“route”消息處理器模塊中。
對於fire-and-forget類型消息,他們先存儲在引起的消息隊列中並由引擎內部的線程池進行延後派發。一旦消息派發完成後則由引擎將其銷燬。
爲了處理route消息請求(很有可能在另外一個模塊中),,我們首先聲明一個從MessageHandler派生的類RouteHandler。
然後,由於方法received在類MessageHandler中是純虛函數,我們必須重載。
最後,在插件的initialized方法中,安裝此消息處理器