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

你的笑靥 发表于: 2020-02-11   最后更新时间: 2020-02-11  

就像这样

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

@KafkaListener(topics = "test")
public void m2(){
    log.info("456");
}
然后控制台就会只打印123不打印456,这种问题怎么解决呢?


您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: SpringBoot集成kafka,运行报 Caused by: java.lang.IllegalStateException: Topic(s) [myTopic] is/are not present and missingTopicsFatal is true
下一条: Kafka消费者崩溃,有什么处理办法么?

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

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

     @KafkaListener(id = "topics = "test", groupId = "不要相同")
    
    • 半兽人大佬,你好.如果这个topic是我自己手动创建的,我创建的时候没有指定groupId,但是我在yml/properties配置文件中指定了groupId的值.这样也是不可以的吗?

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

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

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