Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当另一方挂断时如何停止AGI脚本_Java_Asterisk_Terminate_Agi - Fatal编程技术网

Java 当另一方挂断时如何停止AGI脚本

Java 当另一方挂断时如何停止AGI脚本,java,asterisk,terminate,agi,Java,Asterisk,Terminate,Agi,我有一个Java程序,它发起对客户机的调用,并在应答时将其连接到拨号计划中的一个扩展。该扩展反过来运行一个AGI脚本来与客户机进行一些交互。 如果客户坚持到最后,一切都是完美的。但是如果他挂在中间,AGI脚本继续运行。我希望它在客户挂断电话时停止 以下是原始java程序的摘录: OriginateAction originateAction; ManagerResponse originateResponse; originateAction=new OriginateAction(); ori

我有一个Java程序,它发起对客户机的调用,并在应答时将其连接到拨号计划中的一个扩展。该扩展反过来运行一个AGI脚本来与客户机进行一些交互。 如果客户坚持到最后,一切都是完美的。但是如果他挂在中间,AGI脚本继续运行。我希望它在客户挂断电话时停止

以下是原始java程序的摘录:

OriginateAction originateAction;
ManagerResponse originateResponse;
originateAction=new OriginateAction();
originateAction.setChannel(phoneNumber);
originateAction.setExten("700");
originateAction.setContext("users");
originateAction.setPriority(new Integer(1));

//connect to Asterisk and login
ManagerConnectionFactory factory = new ManagerConnectionFactory("localhost","******","******");
managerConnection = factory.createManagerConnection();
managerConnection.login();
//send the originate action and wait for a maximum of 30 seconds to get a response
originateResponse=managerConnection.sendAction(originateAction, 30000);
计划的摘录

exten =>700,1,Agi(agi://localhost/message.agi,${var1},${var2},${var3},${var4}); script to play
和agi脚本的摘录

public void service(AgiRequest arg0, AgiChannel arg1) throws AgiException {
        setVariable("missedSteps","4");
        verbose("  --------------  missed steps: 4 ----------------", 3);
        // Answer the channel and welcome
        answer();
        streamFile("silence/1");
        streamFile("welcome");
        setVariable("missedSteps","3");
        verbose("  --------------  missed steps: 3 ----------------", 3);
        //Read the file
        streamFile(fileName);
        setVariable("missedSteps","2");
        verbose("  --------------  missed steps: 2 ----------------", 3);
            ..........
            ..........
        setVariable("missedSteps","1");
        verbose("  --------------  missed steps: 1 ----------------", 3);
            ..........
            ..........
        setVariable("missedSteps","0");
        verbose("  --------------  missed steps: 0 ----------------", 3);
        //hangup
        hangup();

正如你所看到的,我试图在脚本中保留一个变量来跟踪演变,我想保留这个变量以将其存储在调用日志中。正如您所看到的,我添加了一些详细的调试命令,在控制台上看到,“missedSteps”变量从4一直前进到0,无论客户端是否挂断。

您可以检查CHANNEL(checkhangup)变量。

意外地找到了解决方案。
事实上,AGI脚本在“streamFile”执行失败时停止。因此,在更新跟踪变量之前,我只是在每个关键步骤之前加入了一些“streamFile(“silene/1”)。AGI脚本将在到达该指令时停止,变量将不会更新。

您能再解释一下吗?我在星号文档中找不到通道挂起变量。它确实尝试在Dialplan中创建一个变量,该变量在通道挂起时设置为1,并在Agi脚本的每个关键步骤进行检查。但它同样不起作用。事实上,Asterisk似乎只在AGI脚本完成运行后才运行“h”扩展名。它称为checkhangup now。使用“星号-rx”核心显示功能通道“”查看文件。