关于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
相关产品推荐
相关产品推荐

