让AgiCahnnel活了很长时间

时间:2014-01-30 12:43:02

标签: asterisk agi

以下问题与asterisk-java API有关。

在我们的应用程序中,我们希望能够在很长一段时间内将命令发送到特定的星号通道。

这是一个我们想要操纵的持久电话(可能会持续几个小时)。

接近它的一种方法是从星号进行AGI调用,这将创建一个AgiScript,它将包含我们将用于发送命令的AgiChannel实例。

我知道一旦AgiScript#serve()方法完成,频道就会关闭。

作为一种解决方法,我们会暂停serve()主题,以便在我们需要时保持AgiChannel开放。

问题

我们是否应该留意最终会自动关闭频道的超时?

我们是否需要定期发送至少NoOp以保持开放状态?

总的来说,这看起来并不是一个好的解决方案,所以我想问一下我们是否还有其他选择来实现我们的目标?

3 个答案:

答案 0 :(得分:2)

根据您的工作情况,最好使用AMI(星号管理器界面)。

如果您的电话被桥接(与某人交谈),那么您实际上无法控制。在AGI中你会告诉它调用Dial,并且该线程将被阻塞,直到Dial返回,因此该线程没有办法发送新命令。即使没有阻止AsteriskJava,星号本身也不会期待新的命令。

在AMI中,您可以使用“重定向”操作解决此问题,并将频道重定向远离网桥。或者,如果您只需要例如得到一些通道变量,你可以从AMI异步地做到这一点。

甚至可以通过AMI发出AGI命令。

Here是一些AMI命令的列表。您可以使用“manager show commands”从星号内部查看所有这些内容。

您可以使用ORIGINATE创建一个呼叫,然后使用ChannelRedirect将其重定向到拨号方案中的各种分机。

如果您在异步模式下对GenI或ChannelRedirect调用AGI应用程序,则可以使用AMI命令“AGI”通过AMI发出AGI命令。

答案 1 :(得分:0)

您应该使用默认线程类启动新线程,并在挂断后移至它处理。

答案 2 :(得分:0)

您可以控制与async agi的所有交互,它是完全异步的,您可以根据需要与调用进行交互。您有一些事件都会返回给您,从这开始就考虑到您可以为您的用例建模对象并实现您可以使用标准agi +的任何行为,您也可以获得AMI权力。