如何在Vert.x中实现JS verticle与Java verticle之间的通信?
JS Vert.x Verticle 与 Java Verticle 连通方案
Vert.x 本身为多语言架构,不同语言编写的 Verticle 底层共享同一个 Vert.x 实例,连通不需要额外引入跨语言调用依赖,直接使用 Vert.x 原生能力即可实现,以下是两种常用的实现方式:
方式1:通过 Event Bus 通信(最常用,松耦合推荐)
Event Bus 是 Vert.x 内置的分布式通信组件,JS 和 Java 侧的调用逻辑完全对齐,不需要感知对方的实现语言。
- Java 侧操作示例:
// Java Verticle 监听JS侧发来的请求示例 vertx.eventBus().consumer("com.example.service.getUser", message -> { // 接收JS侧传递的参数 String userId = (String) message.body(); // 业务逻辑处理完成后返回结果 message.reply("{\"name\":\"张三\",\"id\":" + userId + "}"); }); // Java Verticle 主动发消息给JS侧示例 vertx.eventBus().request("com.example.js.log", "需要记录的日志内容", ar -> { if(ar.succeeded()) { System.out.println("JS侧处理完成: " + ar.result().body()); } }); - JS 侧操作示例(ES4X 环境):
// JS Verticle 监听Java侧消息示例 vertx.eventBus().consumer('com.example.js.log', message => { console.log('收到Java侧消息:', message.body()) message.reply('日志记录完成') }) // JS Verticle 主动调用Java侧服务示例 vertx.eventBus().request('com.example.service.getUser', '12345') .then(res => { console.log('Java侧返回结果:', res.body()) }) .catch(err => { console.error('调用失败:', err) })
注意:如果需要传递自定义对象,建议统一用JSON格式序列化,避免跨语言类型兼容问题
方式2:共享本地数据(适合同进程内高频数据交互)
如果两个 Verticle 部署在同一个 Vert.x 实例进程内,可以通过共享 Map、共享 LocalData 直接传递数据:
- Java 侧存数据:
// 写入全局共享Map vertx.sharedData().getLocalMap("commonCache").put("systemConfig", configObj); - JS 侧取数据:
// 从共享Map读取数据 const commonCache = vertx.sharedData().getLocalMap('commonCache') const systemConfig = commonCache.get('systemConfig')
部署注意事项
- 如果你用 ES4X 启动项目,部署 Java 编写的 Verticle 时,需要把 Java 侧编译好的 jar 包放到项目的
classpath下,部署时直接指定全限定类名即可:// ES4X 中部署Java Verticle示例 vertx.deployVerticle('com.example.MyJavaVerticle') .then(deploymentId => { console.log('Java Verticle 部署成功,ID:', deploymentId) }) - 如果是 Java 项目启动,要部署 JS Verticle,需要把 ES4X 相关依赖引入到 Java 项目的 pom/gradle 依赖中,再指定 JS 文件路径部署即可。
内容的提问来源于stack exchange,提问作者negi_bb
相关产品推荐
相关产品推荐

