0

我正在开发一个非常简单的基于 Asterisk-Java IVR 的程序,它会迎接调用者,从 Web 服务中检索一些信息,将检索到的数据读取给调用者,最后挂断。

我遵循了哪些步骤:

在 extensions_custom.conf 中添加了以下行:

exten => 1000,n,Agi(agi://192.168.0.8/ivryobi.agi)

在 C:\Project\target\classes\ 中创建了以下文件结构

Runnable.java
IvrYobi.java
Runnable.class
IvrYobi.class
fastagi-mapping.properties

在 fastagi-mapping.properties 里面我有:

ivryobi.agi = main.IvrYobi

IvrYoby的内容是:

public class IvrYobi extends BaseAgiScript {

    public void service(AgiRequest request, AgiChannel channel) throws AgiException {
    String callerMsisdn = request.getCallerIdNumber();
}

当它正常工作时

在控制台中运行以下命令

C:\Project\target\classes>java -cp asterisk-java.jar;commons-lang3-3.10.jar;commons-logging-1.2.jar;httpclient-4.5.12.jar;httpcore-4.4.13.jar; mysql-connector-java-8.0.20.jar;. org.asteriskjava.fastagi.DefaultAgiServer

正如您在以下控制台输出中看到的那样,完美运行

2020 年 6 月 30 日下午 6:09:04 org.asteriskjava.fastagi.DefaultAgiServer 启动 INFORMACIËN:监听 *:4573。2020 年 6 月 30 日下午 6:09:09 org.asteriskjava.fastagi.AbstractAgiServer getPool INFORMACIËN:线程池已启动。2020 年 6 月 30 日下午 6:09:09 org.asteriskjava.fastagi.ResourceBundleMappingStrategy loadResourceBundle INFORMACIËN:将“ivryobi.agi”的映射添加到类 IvrYobi ...

当问题出现时

当我运行相同的代码,但在控制台中插入时,我使用 Runnable.java

以下是 Runnable.java 的内容:

DefaultAgiServer server = new DefaultAgiServer();

    public MyRunnable() {

        ClassNameMappingStrategy strategy = new ClassNameMappingStrategy(false);

        server.setMappingStrategy(strategy);

    }

    public void run() {

        try {

            server.startup();

        } catch (IllegalStateException | IOException e) {

            e.printStackTrace();

            server.shutdown();

        }

    }

    public void stop() {
        server.shutdown();
    }

我们可以在 Eclipse 的控制台上观察到以下错误:

0 [main] DEBUG org.asteriskjava.fastagi.DefaultAgiServer - 使用 channelFactory org.asteriskjava.fastagi.internal.DefaultAgiChannelFactory 9 [main] INFO org.asteriskjava.fastagi.DefaultAgiServer - 监听 *:4573。4806 [main] DEBUG org.asteriskjava.fastagi.DefaultAgiServer - 收到来自 /192.168.0.254 的连接 4810 [main] INFO org.asteriskjava.fastagi.DefaultAgiServer - 线程池已启动。4849 [AJ DaemonPool-1.1] 调试 org.asteriskjava.fastagi.ClassNameMappingStrategy - 无法创建 ivryobi.agi 类型的 AgiScript 实例:找不到类,请确保该类存在并且在 CLASSPATH 中可用 4849 [AJ DaemonPool-1.1] 错误org.asteriskjava.fastagi.internal.FastAgiConnectionHandler - 没有为 URL 'agi://192.168.0.8/ivryobi.agi' 配置脚本(脚本'ivryobi.agi')

已尝试故障排除

  • 我已经确定 fastagi-mapping.properties 在 CLASSPATH 上。
  • 尝试了不同的名称和大小写
  • 复制 java 执行路径上的 .properties 文件
  • 将项目编译为可执行 jar
  • 在 Eclipse 中添加/删除了包(例如:com.test.IvrYobi),并将更改应用于 .properties 文件。
  • 我检查了 asterisk-java-3.5.0.jar 里面的代码,看起来如果没有找到配置文件,它会继续运行而不会发出任何警告。由于包装在罐子内,我无法修改该代码。

请问,你还有什么我可以尝试的想法吗?

4

1 回答 1

1

终于自己找到了解决方案

我不得不使用项目的源代码重新编译 asterisk-java.jar

在 DefaultAgiServer.java 上更改行:

resourceBundle = ResourceBundle.getBundle(configResourceBundleName);

和:

    FileInputStream fis = new FileInputStream("myivr.properties");
    resourceBundle = new PropertyResourceBundle(fis);
     
    logger.info("resourceBundle cargado ok!");

在捕获物上,更换

return;

响应更体面,因此您将知道资源是否无法加载

logger.info("resourceBundle cargado ok!");                 
            
        }
        catch (MissingResourceException | IOException e)
        {
            logger.error("No existe el recurso invocado: " + e.getMessage());
            return;
        }
于 2020-07-16T19:53:49.677 回答