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

关于Armeria服务器实例生命周期的技术咨询:等待关闭方法与线程模型疑问

关于Armeria服务器实例生命周期的技术咨询:等待关闭方法与线程模型疑问

嗨,我来帮你解决这两个关于Armeria的问题~

1. 如何等待Armeria服务器直到它关闭?

你说得没错,server.start()返回的Future确实只是在服务器启动完成后就会完成,不会等待关闭。不过Armeria其实提供了专门的方法来让你阻塞等待服务器终止:

  • 使用server.awaitTermination():这个方法会一直阻塞当前线程,直到服务器被关闭。
  • 或者使用server.stopFuture().join():stopFuture()会返回一个Future,这个Future会在服务器完全关闭后才完成,调用join()就能让主线程等待直到服务器关闭。

修改你的代码示例的话,可以改成这样:

final ServerBuilder sb = Server.builder();
sb.http(1234);
// add some services
final Server server = sb.build();

final CompletableFuture<Void> future = server.start();
future.join(); // 等待服务器启动完成

// 在这里阻塞等待服务器关闭
server.awaitTermination();
// 或者用下面这句也可以
// server.stopFuture().join();

这样你的主线程就会一直停在这里,直到服务器被关闭(比如收到Ctrl+C信号)。

2. 关于Armeria的线程模型与进程存活的疑问?

你的程序执行到main函数末尾但进程还活着,是因为Armeria底层基于Netty构建,而Netty默认会使用非守护线程来处理网络IO操作。这些线程包括:

  • Boss线程:负责监听端口、接受新的连接
  • Worker线程:负责处理已连接的Socket的IO读写操作

这些非守护线程会阻止JVM进程退出,哪怕主线程已经执行完了。直到这些线程被终止(比如你按下Ctrl+C触发服务器关闭,或者调用server.stop()),进程才会退出。

Armeria的线程模型本质上是对Netty线程模型的封装,同时它还提供了可配置的业务线程池,用来处理请求的业务逻辑(比如你的服务代码),避免阻塞IO线程。这些线程相关的配置都可以通过ServerBuilder来调整,比如自定义线程池大小、线程名称等。

备注:内容来源于stack exchange,提问作者Sirion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 11:04:33