如果您需要做的只是从 Asterisk 服务器捕获事件,我会建议一种不同的方法。
您似乎正在使用 Asterisk AMI,请查看 Asterisk-Java。根据我的阅读,它是一个 java 库,可以为您处理低级套接字通信和解析,并为与 Asterisk 服务器交互提供更高级别的接口。因此它能够发起连接、捕获事件等等。
理论上,您可以在应用程序启动时打开连接并注册以接收事件。只要连接保持打开状态,应用程序就会从 Asterisk 接收事件。当应用程序结束时,只需关闭连接即可停止事件。
初始化连接
要简单地捕获事件,首先要创建到 Asterisk 服务器的连接。只需提供正确的主机和凭据:
managerFactory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
connection = managerFactory.init( hostNameOrIP
, portNum
, userName
, theSecret ).createManagerConnection();
注册活动
为了接收事件,您必须首先向连接注册一个ManagerEventListener。通常这需要编写一个自定义的 java 类来实现正确的interface。但是,使用一点 dynamic proxy magic,您可以改用标准 CFC。来自 Asterisk 的任何事件都将直接路由到 CFC,并且可以使用 CF 代码进行处理。
要添加侦听器,请使用名为 onManagerEvent 的单个函数创建 CFC。只要在 Asterisk 服务器上发生注册事件,就会调用此函数。
// YourCFCListener.cfc
component {
public void function onManagerEvent(any managerEvent)
{
// For demo purposes, just output a summary of the event to a log file
WriteLog( text=arguments.managerEvent.toString(), file="AsteriskListenerLog" );
}
}
接下来创建一个代理并将其注册到连接中。
proxyListener = createDynamicProxy("path.YourCFCListener"
, [ "org.asteriskjava.manager.ManagerEventListener"] );
connection.addEventListener( proxyListener );
接收事件:
要开始接收事件,请登录并连接到服务器。使用掩码指定要接收的事件:"off"、"on" 或以逗号分隔的特定事件列表(即"system,call,log")。
// receive ALL events
connection.login("on");
连接打开后,您将看到写入演示日志文件的事件(假设存在服务器活动)。对于一次性测试,让页面sleep() 几秒钟以允许一些事件流动。然后关闭连接并停止事件:
sleep(4000);
connection.logoff()
在真正的应用程序中,您可能会打开一次连接并将其存储在持久范围中,例如应用程序。然后仅在应用程序关闭时关闭它。
查看 API,您可以使用它做更多事情。但是,以上内容应该提供一个基本的 POC 示例来帮助您开始捕获事件。