应优先使用 vertx-web,因其包含 HTTP 服务必需的 Router 等 Web 抽象,而 vertx-core 仅提供事件循环、Promise 等底层能力;单独引入 vertx-core 会导致 NoClassDefFoundError。

Vert.x 项目初始化该用 vertx-web 还是 vertx-core?
直接上手就加 vertx-web,否则连 HTTP 服务都起不来。它依赖 vertx-core,但反过来不行——只引 vertx-core 时写个路由会报 NoClassDefFoundError: io/vertx/ext/web/Router。
-
vertx-core是事件循环、上下文、Promise 等底层能力,纯异步调度可用,但没 Web 抽象 -
vertx-web补齐路由、BodyHandler、Cookie、Session 等,微服务接口开发必须带它 - Maven 里别漏掉
vertx-web-client(调外部 API)和vertx-jdbc-client(如果连数据库)
为什么 deployVerticle 后请求没响应?常见启动陷阱
最常踩的坑是:没显式调用 vertx.createHttpServer() + requestHandler + listen,或者把 listen 写在了异步回调外导致立即返回。
- 错误写法:
router.route().handler(ctx -> { /* 处理逻辑 */ });—— 缺少绑定到 Server 的步骤 - 正确链路:
vertx.createHttpServer().requestHandler(router).listen(8080),且listen必须被调用 - 如果用 Kotlin 或 Java 17+ 的
var,注意Router实例不能是局部变量然后在 lambda 里捕获未初始化值 - 端口被占时错误是
java.net.BindException: Address already in use,不是 Vert.x 自己的异常,别往配置里找
Future 和 CompletableFuture 能混用吗?
能,但别主动混。Vert.x 原生用 Future,它轻量、线程安全、自动绑定 Vert.x 上下文;而 CompletableFuture 默认走 ForkJoinPool,一不小心就跳出事件循环,导致上下文丢失、Context#isOnEventLoop 返回 false。
- 需要转接时用
Future.fromCompletionStage(cf),而不是手动 new Future - 数据库操作(如
pgClient.preparedQuery(...))返回的是Future,别用toCompletableFuture()包一层再等 —— 阻塞等待会卡死 event loop - 日志里看到
java.lang.IllegalStateException: Context is not current,八成是误用了CompletableFuture.join()或.get()
本地调试时热加载失效,改完代码要重启?
Vert.x 官方不内置热重载,靠 vertx run 命令加 --redeploy 参数才能监听 class 文件变化。Maven 用户容易忽略这点,以为加了 vertx-maven-plugin 就自动生效。
立即学习“Java免费学习笔记(深入)”;
- 命令行启动:用
vertx run src/main/java/io/example/MainVerticle.java --redeploy="src/**/*.*" --on-redeploy="mvn compile" - IDEA 里 Run Configuration 类型选 “Vert.x” 而非 “Application”,并勾选 “Enable redeploy”
- 注意
--redeploy不监听 resources 目录,默认只扫 Java 文件,想热更配置得加"src/main/resources/**/*" - Windows 下路径通配符要用双引号,否则 shell 解析失败,表现为改了代码毫无反应
Vert.x 的异步模型不靠线程池堆性能,靠单线程事件循环复用上下文,所以每个 Verticle 实例默认只在一个 event loop 上跑——这个约束决定了很多“看起来应该并行”的操作其实串行执行,别指望加线程数解决吞吐问题。











