在FreeSWITCH中执行长期运行的嵌入式脚本–Lua语言例子

简介: 众所周知,FreeSWITCH中可以使用嵌入式的脚本语言javascript、lua等来控制呼叫流程。而更复杂一点操作可能就需要使用Event Socket了。其实不然,嵌入式的脚本也可以一直运行,并可以监听所有的Event,就像使用Event Socket起一个单独的Daemon一样。

众所周知,FreeSWITCH中可以使用嵌入式的脚本语言javascript、lua等来控制呼叫流程。而更复杂一点操作可能就需要使用Event Socket了。其实不然,嵌入式的脚本也可以一直运行,并可以监听所有的Event,就像使用Event Socket起一个单独的Daemon一样。

这里我们以lua为例来讲一下都有哪些限制以及如何解决。

首先,在控制台或fs_cli中执行一个Lua脚本有两种方式,lua和luarun。二者的不同就是lua是在当前线程中运行的,所以,它会阻塞;而luarun会spawn一个新的线程,不会阻塞当前的线程执行。

另外,你也可以写到lua.conf配置文件中,这样它就能随FreeSWITCH一起启动。

``

脚本后面可以加参数,如 luarun test.lua arg1 arg2,在脚本中,就可以通过argv[1], argv[2]来获得参数的值。而argv[0]是脚本的名字。

如果要让脚本一直运行,脚本中必须有一个无限循环。你可以这样做:

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


但这样的脚本是无法终止的,由于FreeSWITCH使用swig支持这些嵌入式语言,而有些语言没有退出机制,所以,所有语言的退出机制都没有在FreeSWITCH中实现,即使unload相关的语言模块也不行,也是因为如此,为了避免产生问题,所有语言模块也都不能unload。

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

既然是长期运行的脚本,那,为什么为停止呢?是的,大部分时间你不需要,但,如果你想修改脚本,总不会每次都重启FreeSWITCH吧?尤其是在调试的时候。

那,还有别的办法吗?


我们可以使用事件机制构造另一个循环:

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发出一个事件,并打印该事件的XML表示。当然,事件总会有的。如每个电话初始化、挂机等都会有相应的事件。除此之外,FreeSWITCH内部也会毎20秒发出一个heartbeat事件,这样你就可以定时执行一些任务。

当然如果使用 con:pop(0)也可以变成无阻塞的,但你必须在循环内部执行一些sleep()以防止脚本占用太多的资源。

通过这种方法,你应该就能想到办法让脚本退出了。那就是,另外执行一个脚本触发一个custom的事件,当该脚本监测到特定的custom事件后退出。当然你


也可以不退出,比方说,打印一些信息以用于调试。

我写了一个gateway_report.lua脚本。就用了这种技术。思路是:监听所有事件。如果收到hangup,则判断是通过哪个gateway出去的,并计算一些统计信息。如果需要保存这些信息,可以有以下几种方式:

1)fire_event,即触发另一个事件,这样,如果有其它程序监听,就可以收到这个事件,从而可以进行处理,如存入数据库等。

2)http_post,发一个HTTP post请求到一个HTTP server,HTTP server接收到请求后进行下一步处理。其中,http_post是无阻塞的,以提高效率,即只发请求,而不等待处理结果。


3)db,可以通过luasql直接写到数据库,未完全实现

4)当然你也可以直接通过io.open写到一个本地文件,未实现…

由于这种脚本会在FreeSWITCH内部执行,需要消耗FreeSWITCH的资源,因此,在大话务量(确切来说是“大事件量”)的情况下还是应该用Event Socket。

相关文章
|
8月前
|
存储 NoSQL Redis
Redis的Lua脚本有什么作用?
Redis Lua脚本用于减少网络开销、实现原子操作及扩展指令集。它能合并操作降低网络延迟,保证原子性,替代不支持回滚的事务。通过脚本,代码复用率提高,且可自定义指令,如实现分布式锁,增强Redis功能和灵活性。
275 1
|
24天前
|
监控 安全
公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
33 6
|
7月前
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
257 0
|
3月前
|
缓存 分布式计算 NoSQL
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
41 2
|
4月前
|
存储 JSON Ubuntu
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
如何使用 Lua 脚本进行更复杂的网络请求,比如 POST 请求?
|
5月前
|
存储 NoSQL Redis
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
Tair的发展问题之在Redis集群模式下,Lua脚本操作key面临什么问题,如何解决
|
7月前
|
JSON 监控 数据格式
使用Lua代码扩展上网行为管理软件的脚本功能
本文介绍了如何使用Lua脚本增强上网行为管理,包括过滤URL、记录用户访问日志、控制带宽和自动提交监控数据到网站。Lua是一种轻量级语言,适合编写扩展脚本。文中提供多个示例代码,如URL过滤器、用户活动日志记录器和带宽控制器,帮助用户根据需求定制网络管理功能。通过这些示例,用户可以快速掌握Lua在上网行为管理中的应用。
192 4
|
7月前
|
NoSQL API Redis
使用Redis Lua脚本实现高级限流策略
使用Redis Lua脚本实现高级限流策略
223 0
|
7月前
|
消息中间件 NoSQL Java
Spring Boot中使用Redis和Lua脚本实现延时队列
Spring Boot中使用Redis和Lua脚本实现延时队列
|
7月前
|
NoSQL Java Redis
redis的lua脚本
在 Lua 脚本中,可以使用redis.call()函数来执行Redis命令.
64 0