Vert.x事件总线:发布者不接收自身消息的实现方法
在Vert.x中实现发布者自身不接收自己发送的主题消息
完全可行,这是Vert.x开发中很常见的需求,核心思路是在消息中标记发布者身份,订阅端过滤掉自身发送的消息,以下是两种具体实现方案:
方案1:自定义发送者ID标记
每个Verticle在发送消息时,通过消息头携带自己的唯一标识(比如自定义的V1/V2这类ID),订阅时对比标识,忽略自身发送的消息:
发送消息(以V1为例)
// 发送时在消息头添加自己的ID vertx.eventBus().publish("topic", "message", new DeliveryOptions() .addHeader("sender-id", "V1"));
接收消息(所有Verticle通用逻辑)
// 每个Verticle定义自己的ID String myId = "V1"; // V2/V3/V4/V5对应修改 vertx.eventBus().consumer("topic", message -> { String senderId = message.headers().get("sender-id"); // 过滤掉自身发送的消息 if (!myId.equals(senderId)) { System.out.println("处理消息:" + message.body()); } });
方案2:利用Verticle部署ID(更通用)
Vert.x每个部署的Verticle都有唯一的deploymentID,可以直接用这个ID作为标识,无需手动维护自定义ID:
发送消息
// 获取当前Verticle的部署ID String myDeploymentId = vertx.getOrCreateContext().deploymentID(); vertx.eventBus().publish("topic", "message", new DeliveryOptions() .addHeader("sender-deployment-id", myDeploymentId));
接收消息
String myDeploymentId = vertx.getOrCreateContext().deploymentID(); vertx.eventBus().consumer("topic", message -> { String senderId = message.headers().get("sender-deployment-id"); if (!myDeploymentId.equals(senderId)) { // 执行消息处理逻辑 System.out.println("收到消息:" + message.body()); } });
补充说明
Vert.x的Event Bus publish方法默认会将消息推送给所有订阅该主题的消费者,包括发布者自己,官方并没有提供直接关闭该行为的配置,因此通过业务层身份过滤是最直接且通用的解决方案,无论在单机还是集群环境下都能正常工作。
内容的提问来源于stack exchange,提问作者slesh
相关产品推荐
相关产品推荐

