【问题标题】:Use ColdFusion to read events over a TCP/IP stream使用 ColdFusion 通过 TCP/IP 流读取事件
【发布时间】:2013-05-21 19:52:01
【问题描述】:

我们的新电话系统正在使用 Asterisk 管理器 API,它允许通过 TCP/IP 流读取事件和发出命令。我的问题是.. 有没有办法使用 ColdFusion 来读取(并依次处理)事件流?到目前为止,我可以通过 telnet 查看电话事件(来电、转接、挂断等),我想知道是否可以使用 ColdFusion 事件网关在这些事件到来时对其进行处理?

一旦建立初始连接(通过 telnet),我必须提交以下 key:values 以便在流开始之前验证连接。

Action: login<CRLF>
Username: usr<CRLF>
Secret: abc123<CRLF>
<CRLF>

只是想说明这一点,因为我不确定以这种方式使用 Web 服务是否会破坏交易。另请注意,我们使用的是 ColdFusion 10 Enterprise。

【问题讨论】:

  • 我不确定,但我认为 ColdFusion 事件网关不能这样使用。他们是听众。我不认为他们可以发起连接。您也许可以使用cfexecute 在服务器上调用 telnet。
  • Miguel,是的,我很确定我可以使用 cfexecute 但不幸的是,连接不会保持打开状态来读取/处理流。

标签: coldfusion asterisk coldfusion-10


【解决方案1】:

是的——你想使用一个套接字网关。 Ben Nadel 有一篇关于如何做到这一点的精彩文章:Using Socket Gateways To Communicate Between ColdFusion And Node.js

虽然他在示例中使用了 Node.js,但您应该能够使用他的指南来设置 Socket Gateway,然后按照您认为合适的方式处理传递给它的数据。

【讨论】:

  • 但 ColdFusion 网关是那篇文章中的监听器。 Node.js 启动与 ColdFusion 服务器的通信。 ColdFusion 网关将如何启动与电话系统的 telnet 通信?
  • 啊,显然我误读了你的问题。我以为您希望 CF 处理请求,而不是发送请求。
  • 是的,我确实看到了 Ben 的文章并开始使用他的演示创建一个粗略的脚本,直到我也意识到这是一个听力应用程序。
【解决方案2】:

您需要的是服务器端 TCP 客户端。我建议easySocket,一个简单的UDF,它允许您利用Java 套接字通过Coldfusion 发送TCP 消息。

【讨论】:

    【解决方案3】:

    我意识到这是一个旧线程,但我发布这个以防万一它对下一个人有所帮助....

    AFAIK,标准的 CF 事件网关无法做到这一点。但是,一种可能性是使用Asterisk-Java。它是一个允许与 Asterisk 服务器通信的 java 库。更具体地说它的管理器界面:

    ... 能够发送 [actions] 和接收 [responses] 和 [事件]。它没有添加任何进一步的功能,而是 为 Asterisk 的 Manager API 提供一个 Java 视图(让你从 TCP/IP 连接和解析)。

    所以它可以用来向服务器发出命令,并接收事件,就像 telnet。

    入门示例:

    1. 下载 Asterisk-Java jar 并通过 Application.cfc 中的 this.javaSettings 加载它

    2. 使用 Asterisk 服务器的设置创建一个 ManagerConnection

      factory = createObject("java", "org.asteriskjava.manager.ManagerConnectionFactory");
      connection = factory.init( "hostNameOrIP"
                               , portNum
                               , "userName"
                               , "theSecret" ).createManagerConnection();
      
    3. 创建一个 CFC 作为监听器。它将接收和处理来自 Asterisk 的事件:

      component {
          public void function onManagerEvent(any managerEvent)
          {
              // For demo purposes, just output a summary of the event
              WriteLog( text=arguments.managerEvent.toString(), file="AsteriskLog" );
          }
      }
      
    4. 使用一点dynamic proxy magic,向连接注册CFC:

      proxyListener = createDynamicProxy("path.YourCFCListener"
                       , ["org.asteriskjava.manager.ManagerEventListener"]);
      connection.addEventListener( proxyListener );
      
    5. 登录服务器开始接收事件。设置适当的事件级别:“off”、“on”或可用事件的 csv 列表 - “system”、“call”和/或“log”。

      connection.login("on");
      
    6. 运行一个简单的“Ping”测试以验证一切正常。然后休眠几秒钟以允许一些事件流动。然后关闭连接。

      action = createObject("java", "org.asteriskjava.manager.action.PingAction").init();
      response = application.connection.sendAction(action);
      writeDump(response.getResponse());      
      
      // disconnect and stop events
      sleep(4000);
      connection.logoff();
      
    7. 检查演示日志文件。它应该包含一个或多个事件。

      "Information","http-bio-8500-exec-4","10/14/16","15:17:19","XXXXX","org.asteriskjava.manager.event.ConnectEvent[dateReceived=Fri Oct 14 15:17:19 CDT 2016,....]"
      

    注意:在实际应用程序中,连接可能会在 OnApplicationStart 中打开一次,并存储在持久范围中。 只要连接保持打开状态,事件就会继续流式传输。连接应该只在应用程序时关闭 结束,停止事件流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2011-02-27
      • 2012-12-02
      • 2019-01-20
      相关资源
      最近更新 更多