欧美,精品,综合,亚洲,好吊妞视频免新费观看,免费观看三级吃奶,一级a片女人自慰免费看

 首頁 > 新聞 > 專家觀點 >

《FreeSWITCH: VoIP實戰(zhàn)》:執(zhí)行長期運行的嵌入式腳本Lua語言例子

2012-08-27 17:02:34   作者:杜金房    來源:FreeSWITCH    評論:0  點擊:


  眾所周知,F(xiàn)reeSWITCH中可以使用嵌入式的腳本語言javascript、lua等來控制呼叫流程。而更復雜一點操作可能就需要使用Event Socket了。其實不然,嵌入式的腳本也可以一直運行,并可以監(jiān)聽所有的Event,就像使用Event Socket起一個單獨的Daemon一樣。

  這里我們以lua為例來講一下都有哪些限制以及如何解決。

  首先,在控制臺或fs_cli中執(zhí)行一個Lua腳本有兩種方式,lua和luarun。二者的不同就是lua是在當前線程中運行的,所以,它會阻塞;而luarun會spawn一個新的線程,不會阻塞當前的線程執(zhí)行。

  另外,你也可以寫到lua.conf配置文件中,這樣它就能隨FreeSWITCH一起啟動。

 <param name="startup-script" value="gateway_report.lua"/>

  腳本后面可以加參數(shù),如 luarun test.lua arg1 arg2,在腳本中,就可以通過argv[1], argv[2]來獲得參數(shù)的值。而argv[0]是腳本的名字。

  如果要讓腳本一直運行,腳本中必須有一個無限循環(huán)。你可以這樣做:

while true do
  -- Sleep for 500 milliseconds
  freeswitch.msleep(500);
  freeswitch.consoleLog("info", "blah...");
end

  但這樣的腳本是無法終止的,由于FreeSWITCH使用swig支持這些嵌入式語言,而有些語言沒有退出機制,所以,所有語言的退出機制都沒有在FreeSWITCH中實現(xiàn),即使unload相關的語言模塊也不行,也是因為如此,為了避免產(chǎn)生問題,所有語言模塊也都不能unload。

  另外,使用freeswitch.msleep() 也不安全,Wiki上說: Do not use this on a session-based script or bad things will happen。

  既然是長期運行的腳本,那,為什么為停止呢?是的,大部分時間你不需要,但,如果你想修改腳本,總不會每次都重啟FreeSWITCH吧?尤其是在調(diào)試的時候。

  那,還有別的辦法嗎?

  我們可以使用事件機制構造另一個循環(huán):

con = freeswitch.EventConsumer("all");                                                                        
for e in (function() return con:pop(1) end) do
  freeswitch.consoleLog("info", "event\n" .. e:serialize("xml"));
end

  上面的代碼中,con被初始化成一個事件消費者。它會一直阻塞并等待FreeSWITCH發(fā)出一個事件,并打印該事件的XML表示。當然,事件總會有的。如每個電話初始化、掛機等都會有相應的事件。除此之外,F(xiàn)reeSWITCH內(nèi)部也會毎20秒發(fā)出一個heartbeat事件,這樣你就可以定時執(zhí)行一些任務。

  當然如果使用 con:pop(0)也可以變成無阻塞的,但你必須在循環(huán)內(nèi)部執(zhí)行一些sleep()以防止腳本占用太多的資源。

  通過這種方法,你應該就能想到辦法讓腳本退出了。那就是,另外執(zhí)行一個腳本觸發(fā)一個custom的事件,當該腳本監(jiān)測到特定的custom事件后退出。當然你也可以不退出,比方說,打印一些信息以用于調(diào)試。

  我寫了一個gateway_report.lua腳本。就用了這種技術。思路是:監(jiān)聽所有事件。如果收到hangup,則判斷是通過哪個gateway出去的,并計算一些統(tǒng)計信息。如果需要保存這些信息,可以有以下幾種方式:

  1. fire_event,即觸發(fā)另一個事件,這樣,如果有其它程序監(jiān)聽,就可以收到這個事件,從而可以進行處理,如存入數(shù)據(jù)庫等。
  2. http_post,發(fā)一個HTTP post請求到一個HTTP server,HTTP server接收到請求后進行下一步處理。其中,http_post是無阻塞的,以提高效率,即只發(fā)請求,而不等待處理結果。
  3. db,可以通過luasql直接寫到數(shù)據(jù)庫,未完全實現(xiàn)
  4. 當然你也可以直接通過io.open寫到一個本地文件,未實現(xiàn)...

  由于這種腳本會在FreeSWITCH內(nèi)部執(zhí)行,需要消耗FreeSWITCH的資源,因此,在大話務量(確切來說是“大事件量”)的情況下還是應該用Event Socket。

相關熱詞搜索: FreeSWITCH VoIP

上一篇:呼叫中心建設常見專業(yè)名詞

下一篇:最后一頁

分享到: 收藏

專題