You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Asterisk-Java AGI:DefaultAgiServer执行startup后应用冻结排查

问题分析:Asterisk AGI服务启动后应用冻结

你遇到的这个应用冻结问题,核心原因其实很明确——你在Spring Bean的初始化方法里直接调用了DefaultAgiServer.startup(),而这个方法是阻塞式的。

具体原因拆解:

  • DefaultAgiServer.startup()方法的设计是启动监听线程后,会进入一个持续运行的循环来等待AGI请求,这个方法不会主动返回,直到你调用shutdown()关闭服务器。
  • Spring初始化Bean的时候,是在主线程中执行@Bean标注的方法的。当你在这个方法里调用startup(),主线程就会被这个阻塞调用完全占用,导致Spring无法继续完成后续的上下文初始化工作,整个应用自然就“卡住”了。
  • 你看到的日志Listening on *:4573其实已经说明AGI服务器本身已经成功启动并开始监听端口了,只是Spring的初始化流程被卡住,导致应用无法正常进入可用状态。

解决办法

要解决这个问题,关键是把AGI服务器的启动逻辑放到独立的线程中,不要占用Spring的主线程。这里给你两种简单的实现方式:

方式一:使用异步线程启动

@Bean(name = "agi")
public DefaultAgiServer getAsteriskAgi() throws Exception {
    DefaultAgiServer agiServer = new DefaultAgiServer();
    // 用CompletableFuture开启异步线程执行启动逻辑
    CompletableFuture.runAsync(agiServer::startup);
    return agiServer;
}

方式二:手动创建线程启动

@Bean(name = "agi")
public DefaultAgiServer getAsteriskAgi() throws Exception {
    DefaultAgiServer agiServer = new DefaultAgiServer();
    // 创建独立线程启动AGI服务器
    new Thread(agiServer::startup).start();
    return agiServer;
}

额外注意事项

为了避免应用关闭时AGI服务器资源泄漏,建议添加销毁回调来优雅关闭服务:

@PreDestroy
public void shutdownAgiServer(@Qualifier("agi") DefaultAgiServer agiServer) {
    agiServer.shutdown();
}

内容的提问来源于stack exchange,提问作者Aleksei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:23:04