如何获取Quarkus动态端口模式下应用实际监听的HTTP端口
获取Quarkus动态端口的真实运行端口
当你设置quarkus.http.port=0让Quarkus使用随机动态端口时,@ConfigProperty(name = "quarkus.http.port")只会返回配置文件里设置的0——因为这个配置值是启动前的静态配置,不会自动同步启动后系统分配的真实端口。要获取真实端口,可以用以下两种常用方法:
方法一:注入VertxHttpServer直接获取
Quarkus底层用Vert.x处理HTTP请求,你可以注入VertxHttpServer实例,通过它获取已启动的服务器实例,进而拿到真实端口:
import io.quarkus.vertx.http.runtime.VertxHttpServer; import jakarta.inject.Inject; import jakarta.enterprise.context.ApplicationScoped; @ApplicationScoped public class PortResolver { @Inject VertxHttpServer vertxHttpServer; public int getRealPort() { // actualPort()方法返回系统分配的真实端口 return vertxHttpServer.getServer().actualPort(); } }
方法二:监听应用启动事件获取
如果需要在应用启动完成后立即获取端口,可以监听StartupEvent,此时服务器已经完成端口分配:
import io.quarkus.runtime.StartupEvent; import io.quarkus.vertx.http.runtime.VertxHttpServer; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; public class PortInitializer { @Inject VertxHttpServer vertxHttpServer; void onAppStartup(@Observes StartupEvent event) { int realPort = vertxHttpServer.getServer().actualPort(); // 这里可以做端口记录、后续业务逻辑处理等操作 System.out.println("当前应用真实运行端口: " + realPort); } }
注意:这两种方法都需要在应用启动完成后调用,过早调用(比如在@PostConstruct方法里)可能会拿到无效值,因为此时服务器还未完成端口绑定。
内容的提问来源于stack exchange,提问作者matteo baudino
相关产品推荐
相关产品推荐

