无标题文档
任务生命周期
现在,CCXML生命周期需要更多的净化。CCXML任务可由下列原因启动:
- 进入平台的最新电话呼叫。
- CCXML应用程序执行<createccxml>。
- 一个外部任务发布进入平台的请求。
当任务由拨入呼叫启动时,它具有与新连接相关的事件终点的所有权。新的CCXML任务将负责处理连接状态事件,并执行连接行为。
每个CCXML任务都有一组称之为任务变量的ECMAScript变量,它们在执行过程中可为程序所用。当CCXML 任务建立之时,任务变量即由CCXML执行定义,对运行的脚本而言,它们为只读变量,并不能被CCXML程序修改。这些变量包含诸如任务标识符、任务启动原因、所有连接对象列表等信息。CCXML应用程序能够通过评估任务变量session.startupmode的内容,决定任务启动的原因。
CCXML任务以执行CCXML文档开始。执行流程可随<if>、<elseif>、<else>、<fetch>和<goto>而改变。大多数的CCXML任务在处理进入事件流的<eventprocessor>中产生。CCXML任务可以通过<createccxml>发布新的CCXML任务。最新的CCXML任务在独立的背景及原始CCXML任务的变量空间下执行,完全独立于最初任务的生命周期。任务之间通过<send>发送信息来进行交流。
一个CCXML任务可以下面的某种方式结束:
- CCXML应用程序执行<exit>。
- 发生未经处理的”error.*”事件。
- 发生未经处理的”ccxml.kill”事件。
- 产生”ccxml.kill.unconditional”事件。
当CCXML任务结束时,此任务拥有的所有活跃连接、会议与对话由平台自动终止。
一般来说,连接比任务要短。当连接终止时任务并未结束。一个CCXML任务不需要任何与它有关的连接。启动后,由于<createcall>和<move>所发出的请求,任务可能需要连接。图A与图B说明了几种不同情形下的生命周期。
图A

图B

任务生命周期,不同情形
在我们的“世界你好”实例(Example1.txt)中,当一个任务结束时,那个任务拥有的任何资源,包括连接都被终止——如图C所示。任务不仅有生命周期情形,还有多个连续的连接,甚至还有数个并发的连接。一个连接可以由一个CCXML任务转移到另一个CCXML任务。
图C

终止
任何时候平台希望终止一个CCXML任务,它必须提出一个ccxml.kill事件来通知CCXML应用程序。CCXML应用程序对此事件做出的正常响应为:整理并终止当前活跃的连接、会议或对话,然后执行一个<exit>元素。
让我们看一个从CCXML中运行简单VoiceXML对话的更为复杂的例子。应用程序答复一个拨入的电话呼叫,然后将它连接到一个VoiceXML对话上,对话再返回一个记录到平台中的值(Example2.txt与Example2.vxml.txt)。这是CCXML与VoiceXML连接的起点。
例2
<?xml version="1.0" encoding="UTF-8"?>
<ccxml version="1.0" xmlns="http://www.w3.org/2002/09/ccxml">
<!-- Lets declare our state var -->
<var name="state0" expr="'init'"/>
<eventprocessorstatevariable="state0">
<!-- Process the incoming call -->
<transition state="init" event="connection.alerting">
<accept/>
</transition>
<!-- Call has been answered -->
<transition state="init" event="connection.connected" name="evt">
<log expr="'Houston, we have liftoff.'"/>
<dialogstartsrc="'example2-dialog.vxml'"/>
<assign name="state0" expr="'dialogActive'" />
</transition>
<!-- Process the incoming call -->
<transition state="dialogActive" event="dialog.exit" name="evt">
<log expr="'Houston, the dialog returned [' + evt.values.input
+ ']'" />
<exit />
</transition>
<!-- Caller hung up. Lets just go on and end the session -->
<transition event="connection.disconnected" name="evt">
<exit/>
</transition>
<!-- Something went wrong. Lets go on and log some info and end
the call -->
<transition event="error.*" name="evt">
<log expr="'Houston, we have a problem: (' + evt.reason +
')'"/>
<exit/>
</transition>
</eventprocessor>
</ccxml>
例2-VXML
<?xml version="1.0"?>
<vxmlxmlns="http://www.w3.org/2001/vxml" version="2.0">
<form id="Form">
<field name="input" type="digits">
<prompt>
Please say some numbers ...
</prompt>
<filled>
<exit namelist="input"/>
</filled>
</field>
</form>
</vxml>
当一个CCXML文档如例2那样收到<eventprocessor>中的一个connection.alerting事件时,<transition>块中的<accept>就会执行,这将促使基础平台向电话系统发出连接呼叫的信号。然后,CCXML文档可能会与呼叫者进行交互式的对话任务,或执行其它电话操作(如对外呼叫,加入呼叫等)。
对话处理
CCXML并不提供任何与呼叫者交互的机制,仅仅依靠VoiceXML这样单独的对话环境。任何时候需要与呼叫者交互时,CCXML可以启动由VoiceXML或其它技术提供的单独对话功能。对话交互完成以后,系统向CCXML任务发送一个异步事件,它能够应用对话环境返回的任意结果,以决定下一步的行动。操作启动后,所有处理对话的CCXML元素与直接返回到CCXML任务的控制异步。不管对话操作是成功完成,还是失败,一个异步事件都要向CCXML任务进行通报。
CCXML程序应用<dialogstart>元素启动对话(见例2)。执行此元素可连接到一个对话环境,并指导它开始与呼叫者进行交互。在一些对话环境中,对对话环境进行初始化可能要花上一些时间,因此,仅仅应用<dialogstart>元素就会使呼叫者听到静音或“忙音”。为避免出现这种情况,CCXML提供在连接与启动开始前准备对话环境的功能,这一功能由<dialogprepare>元素来完成。任何由<dialogstart>启动,或由<dialogprepare>准备的对话都可用<dialogterminate>元素来终止。尽管支持的对话环境会产生各种实际行为,但CCXML执行必须支持<dialogprepare>、<dialogstart>与<dialogterminate>元素。
如果对话由于某种原因不能启动,一个error.dialog.notstarted事件即被贴粘到处理<dialogstart>请求的CCXML任务事件队列中。对话完成后,一个dialog.exit事件即被贴粘到启动它的CCXML任务事件队列中。在我们所举的例子中,我们用转换元素<transition state="dialogActive" event="dialog.exit" name="evt">处理对话数据。
VoiceXML整合
CCXML与VoiceXML 2.0需要能够在浏览器之间交换事件。提交信息的方法由平台决定,但也存在一些基本的功能。每一个运行中的CCXML任务都有一个用来处理CCXML事件的队列,它与同样由CCXML任务建立的VoiceXML对话事件处理过程相互独立。执行某些CCXML元素,如<dialogterminate>与<send>,可能会导致事件被送交到VoiceXML浏览器;同样,执行某些VoiceXML元素,如<transfer>,也会导致对话事件的生成,这些事件将被发送到拥有所讨论对话的CCXML任务。
VoiceXML 2.0处理异步或异常事件的功能有限。由于CCXML旨在建立稳健的事件处理机制,CCXML任务主要管理基础网络的连接,异步事件的处理——可以通过外部可访问的事件I/O处理器来传送——主要发生在CCXML应用程序中,它也可对VoiceXML任务进行适当的控制。因此,VoiceXML对话专门集中于与用户进行交互。
当VoiceXML对话沟通一个连接和相关的呼叫线路时,标准的VoiceXML任务变量即从呼叫线路中获得自己的值。否则,这些变量就不会被定义。只要相关的连接或会议发生更新,VoiceXML任务变量就会发生改变。当CCXML应用程序处理一个<dialogstart>元素时,它用提交到<dialogstart>元素的URI,或由<dialogprepare>准备用prepareddialog指定的对话,来启动一个连接的VoiceXML应用程序。
呼叫控制
CCXML的主要目标在于为整个呼叫过程提供呼叫控制。呼叫控制包括:处理拨入呼叫、放置外拨呼叫、沟通(或连接)多条呼叫线路,并最终切断呼叫。CCXML呼叫模型的目标集中于相对简单的呼叫控制类型,使其足够抽象,使呼叫控制可以用所有主要的电话系统来执行,如JAIN呼叫控制(JCC)、CSTA与S.100。
看起来,CCXML在电信行业有着光明的前景,这部分是因为该行业对于统一应用界面的强烈需求。现在有几种相似的处理语言,如CPL、CallXML、ECMA-CSTA、TXML等。你可以在CCXML规范的附录A找到这些语言。
责任编辑:张琎
查看本文的国际来源
|