两个@KafkaListener监听同一个topic只有一个地方能接收到消息

你的笑靥 发表于: 2020-02-11   最后更新时间: 2021-09-06 19:14:02   8,822 游览

就像这样

@KafkaListener(topics = "test")
public void m1(){
    log.info("123");
}

@KafkaListener(topics = "test")
public void m2(){
    log.info("456");
}

然后控制台就会只打印123不打印456,这种问题怎么解决呢?

发表于 2020-02-11

@Kafkalistener默认消费者组名是同一个,也就是说,消息只会发给一个方法,如果你分发消息处理,就从这个方法分发消息。
如果你想都收到消息,是相同的消息,就是订阅者模式,定义成不同的消费者组就可以了。

 @KafkaListener(id = "topics = "test", clientIdPrefix = "myClientId")

 @KafkaListener(id = "topics = "test", groupId = "不要相同")
你的笑靥 -> 半兽人 4年前

半兽人大佬,你好.如果这个topic是我自己手动创建的,我创建的时候没有指定groupId,但是我在yml/properties配置文件中指定了groupId的值.这样也是不可以的吗?

半兽人 -> 你的笑靥 4年前

如果你在配置文件中指定了groupID,那么就意味着你的消费者组是固定了。
不可以指的是什么呢?

你的笑靥 -> 半兽人 4年前

我换个问法,在一个类中不可以被两个不同的方法消费可以同时消费同一个topic中的消息吗?

半兽人 -> 你的笑靥 4年前

如果2个方法都获得相同的消息是可以的(不同的消费者组),上面已经解释过了。
如果想平分消息,只能手动指定topic中分区。

不太清楚你为什么要这样使用,并行消费可以使用下面的,但是都走同一个方法。

kafka.consumer.concurrency=3
你的笑靥 -> 半兽人 4年前

原因是要对数据进行判断,写到一个方法中会影响在正常情况下数据的变化,这个属性我在配置文件中配置了,如果在配置文件中配置了groupId,在@KafkaListener(id = "topics = "test", groupId = "*")也配置了不同的消费组,那这样的话是配置文件中的会生效还是在监听器中生效呢?

啊好了,在监听器中的生效.谢谢半兽人大佬!

疯子 -> 半兽人 4年前

大佬,意思就是两个监听器无法平摊同一个topic中的消息是吧?

半兽人 -> 疯子 4年前

这个问题的核心是消费组哦。

你的答案

查看kafka相关的其他问题或提一个您自己的问题