动态的力量
蓝星际语音平台在V1.6版本开始增加了一个RunBss()的新函数,该函数能够动态装载指定的脚本并执行。
先来看看这个函数的原型:
1.5 动态执行一个脚本: RunBss(bssFile); 说明: 动态加载脚本到内存中执行,该脚本有独立的命名空间,变量和函数不会与调用的脚本冲突, 执行完毕后将从内存中卸载;子脚本将继承主脚本设置好的语音路径、缺省语音文件扩展名等; 子脚本修改语音路径将不影响主脚本的设置。 参数: bssFile : 合法的脚本文件,里面还可以包含其它文件 返回值: 等于bssFile脚本执行return(v)语句返回时的v值 注意: 如果脚本存在语法错误,脚本将不被执行;也不会报错,但会生成编译日志文件,指明具体的错误信息, 所以脚本文件应该先用开发平台编译调试通过后再正式使用。 参见: return(), Eval() 例子: while(true) { WaitRing(1); GetCalleeId(code); // 根据被叫号码执行不同的脚本 if( code=="114" ) RunBss("114.bss"); // 执行114的脚本 else if( code=="117" ) RunBss("117.bss"); // 执行117的脚本 // ... } OnSysQuit(); return(0);
参数bssFile是个字符串,表示一个脚本文件名,可以是全路径,也可以是相对路径,相对路径必须以语音平台所在目录为当前目录。
注意bssFile里面是独立的变量和函数命名空间,也就是说bssFile是独立的,它不能访问父脚本的全局变量或自定义函数。这样可以保证不出现名字冲突,而且能保持业务流程的独立性、完整性。 如果需要和其它脚本交换数据,可以采用消息队列或共享全局变量的方式,请参考<系统函数手册>的相关章节。
在执行bssFile过程中,如果遇到bssFile主流程里的return()语句,将返回到调用流程(也称装载流程或主流程),bssFile就执行完毕了,此时bss将会在内存中卸载,释放所有的资源。
最先想到的应用是声讯方面的被叫号码路由,sp往往有许多号码资源,每个号码对应一个业务流程,动态脚本加载提高了资源利用率,而且更加灵活,解决方法有多种:
例1:
将被叫号码、对应的业务脚本文件名放置在数据库里面,当主流程收到来电时,到数据库里面查找到相应的脚本文件名,动态加载该业务流程。
例2:
将被叫号码、对应的业务脚本文件名放置到ini文件或cfg文件里面,主脚本收到来电时,直接定位到相应的脚本文件并动态加载执行。
动态加载的好处之一是,某线路在同一时刻只有一个脚本流程被加载到内存之中,当业务流程种类很多的情况下,可以大大地提高资源利用率。当然,加载和卸载需要时间,不过蓝星际语音平台经过优化,加载时间非常快速,用户没有任何感觉。
动态加载的好处之二是可以实时修改并发布业务流程,完全不必重启语音平台,因为重启平台可能导致正在执行的业务流程中断。
动态执行脚本一个可以预见的应用是,以通讯的方式远程发布业务流程,蓝星际语音平台本身支持多种层次的网络通讯技术,如TCP/IP,HTTP,或者以DLL架构的SMTP,SOAP等等,可以通过精心的设计来调用远端的脚本,动态执行。这样语音菜单可以动态扩展,流程走向可以动态改变。
另外一个应用是对XML的支持,有很多人喜欢用某种形式的XML(如VoiceXML)来定制流程,或者定制流程的某些部分,简单的解决方案是用Koodoo本身的字符串、文件操作功能(或调用其它语言编写的解析器DLL)来解析XML节点,将XML翻译成相应的Koodoo语言的脚本文件,然后再动态执行这个脚本文件。
这样也能够间接地实现对图形拖拉界面的支持,因为基于XML的图形系统(比如工作流)多如牛毛,甚至有很多开源系统。虽然我不喜欢图形拖拉界面,但有喜欢的人,他们可以在Koodoo的上面去做。Koodoo有这样的能力---在增加了RunBss()这样的动态加载功能后,Koodoo已经变成了出色的后台工具。
动态加载脚本也是插件技术的一种,所谓插件就是可热拔插的动态部件或脚本,加上以前的外部DLL,蓝星际语音平台支持多种插件:
- 1). 外部DLL插件, 是用其它语言编写的动态库;
- 2). 外部BSS插件, 是用Koodoo语言编写的脚本;
- 3). 外部XML插件, 是用XML编写的流程描述;
- 4). 外部JScript插件, 是用JScript编写的代码, 暂不支持。
如此一来,蓝星际语音平台就是一个基础性的框架,用图形描述如下:
动态的力量是巨大的,因为它意味着无限的可能性。
bluesen 2006.3 于深圳