You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 01:40:34