「Kafka 系列(七)」- @KafkaListener 详解

2,969 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情

Kafka 系列文章

前言

对于 Kafka Topic 里面的消息,我们要怎么消费呢?

spring-kafka 提供了消息监听器的功能,我们只需要在消费方法上配置注解 @KafkaListener,就能够实现对消息的监听。

我们不需要关注消费代码,只需要关注消费逻辑,和消费者的关键配置即可。

接受参数

被这个注解修饰的方法,可以有不同种类的入参。总的来说,分为下面四种:

  1. data」- data 不是一个具体的类型,消费者会根据配置的反序列化方式去尝试反序列化 data,因此,发送时和接受时保持一致的序列化反序列化方式,即可成功接受该类型的参数。
  2. ConsumerRecord」- 具体消费数据类,包含 Headers 信息、分区信息、时间戳等,如果要用到这方面的数据,可以使用该类型接受数据。
  3. Acknowledgment」- 用作 ACK 机制的接口。
  4. Consumer」- 消费者类,使用该类我们可以手动提交偏移量、控制消费速率等等。

配置属性

再来看看 @KafkaListener 都提供了什么属性。如下图:

image.png

我们来详细解释一下这些属性都有什么作用:

  • id」- 消费者的 ID,用来唯一标识消费者,当 GroupId 没有被配置的时候,Id 就是 GourpId。
  • containerFactory」- 这里面配置的是监听容器工厂,也就是 ConcurrentKafkaListenerContainerFactory,配置B eanName。
  • topics」- 需要监听的 Topic,可监听多个。
  • topicPartitions」- 可配置更加详细的监听信息,比如监听某个 Topic 中的指定分区,或者从 Offset 为 200 的偏移量开始监听等等。
  • errorHandler」- 监听异常处理器,配置 BeanName。
  • groupId」- 消费组 id。
  • idIsGroup」- 布尔值,ID 是否为 GroupId。
  • clientIdPrefix」- 消费者 ID 前缀。
  • beanRef」- 真实监听容器的BeanName,需要在 BeanName前加两个下划线,就像这样 "__listener"。

示例

@KafkaListener(topics = "${topic}", groupId = "${groupId}", id = "consumer01", )
public void test(ConsumerRecord<String, Student> consumerRecord) {
    Student student = consumerRecord.value();
    log.info("消费了一条消息,这条消息是:{}", student);
}

在这个例子中,我们配置了 topics、groupId 和 id 属性,而 topics 和 groupId 我们配置了占位符,这样我们就能在配置文件中,灵活的修改需要消费的 topic 和 groupId 了。

我们假设资源有限,开发环境和测试环境用的是同一个 Kafka 集群,那么通过配置文件进行隔离也是一个很好的选择。

就是这么简单,上面的代码中,方法 test(consumerRecord) 就是一个消费者,他会自动监听所配置的分区,自动进行消费。

写在最后

目前我在持续更新和维护 Kafka 的系列文章,已经更新到了第七篇,如果你感兴趣的话,期待你的关注。