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

Spring Boot中如何使两个@KafkaListener监听同一Topic并均触发执行?

解决同一Topic下两个@KafkaListener方法仅触发一个的问题

这个问题我之前做Kafka相关项目时也踩过坑,核心是对Kafka消费者组的机制理解不到位!

核心原因

Kafka的消费者组规则很明确:同一个消费者组(groupId相同)内的消费者会共同分摊监听Topic的分区。如果你的vijay Topic只有1个分区,那同一时刻只有一个消费者(也就是你的其中一个@KafkaListener方法)能获取到消息,自然只会触发其中一个方法。

两种可行解决方案

方案1:给两个Listener设置不同的groupId(推荐,满足“每条消息都被两个方法处理”的需求)

如果你的业务要求每条消息都必须被两个方法执行处理,那最简单直接的方式就是让两个Listener归属不同的消费者组。修改代码如下:

类A的方法:

@KafkaListener(topics = "vijay", groupId = "group_id_a")
public void consumeMethodOne(String jsonString) {
    System.out.println("ConsumerPrice1-->" + jsonString);
}

类B的方法:

@KafkaListener(topics = "vijay", groupId = "group_id_b")
public void consumeMethodTwo(String jsonString) {
    // 建议修改输出标识,方便区分是哪个方法触发的
    System.out.println("ConsumerPrice2-->" + jsonString);
}

这样两个Listener会作为独立的消费者组,各自消费整个Topic的所有消息,每条消息都会被两个方法依次处理。

方案2:保持同一groupId,给Topic增加分区并配置并发(适用于负载分摊场景)

如果业务上必须使用同一个groupId,且只是想让两个方法都能分到消息(不是每条消息都触发两个方法),那需要两步操作:

  1. 先给vijay Topic增加至少2个分区(可以通过Kafka命令行或管理工具完成修改)
  2. 给@KafkaListener配置concurrency参数,或者在全局配置中设置消费者并发数。示例:
@KafkaListener(topics = "vijay", groupId = "group_id", concurrency = "2")

不过这种方式下,消息会按分区分发到不同的Listener实例,每条消息只会被其中一个方法处理,适合做消费负载分摊,而非重复消费。

额外小提示

你代码里类B的方法输出和类A完全一致,建议修改成不同的标识,这样测试时能直观看到两个方法都被成功触发了。

内容的提问来源于stack exchange,提问作者vijayk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:52:28