动态的力量

蓝星际语音平台在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. 1). 外部DLL插件, 是用其它语言编写的动态库;
  2. 2). 外部BSS插件, 是用Koodoo语言编写的脚本;
  3. 3). 外部XML插件, 是用XML编写的流程描述;
  4. 4). 外部JScript插件, 是用JScript编写的代码, 暂不支持。

如此一来,蓝星际语音平台就是一个基础性的框架,用图形描述如下:

动态的力量是巨大的,因为它意味着无限的可能性。

bluesen 2006.3 于深圳