跳到主要内容
版本:4.1.1

接收消息

Doubao 中英对照 Receiving Messages

你可以通过配置 MessageListenerContainer 并提供消息监听器来接收消息,也可以使用 @KafkaListener 注解来接收消息。

章节摘要​

📄️手动提交偏移量

通常,在使用 AckMode.MANUAL 或 AckMode.MANUAL_IMMEDIATE 时,确认必须按顺序 进行,因为 Kafka 不为每条记录维护状态,而只为每个 group/partition 维护一个已提交的 偏移量。从版本 2.8 开始,你现在可以设置容器属性 asyncAcks,这使得为 poll 返回的 记录所做的确认可以按任意顺序进行确认。监听器容器会延迟乱序提交,直到收到缺失的 确认为止。Consumer 将被暂停(不投递新记录),直到上一次 poll 的所有偏移量都已提交。

📄️@KafkaListener 属性修改

从版本 2.7.2 开始,你现在可以在容器创建之前以编程方式修改注解属性。为此,向应用 上下文添加一个或多个 KafkaListenerAnnotationBeanPostProcessor.AnnotationEnhancer。 AnnotationEnhancer 是一个 BiFunction<Map<String, Object>, AnnotatedElement, Map<String, Object>,并且必须返回一个属性 map。属性值可以包含 SpEL 和/或属性占位符; enhancer 在执行任何解析之前被调用。如果存在多个 enhancer,并且它们实现了 Ordered, 则将按顺序调用它们。

📄️@KafkaListener 生命周期管理

为 @KafkaListener 注解创建的监听器容器不是应用上下文中的 bean。相反,它们被注册到一个 类型为 KafkaListenerEndpointRegistry 的基础架构 bean 中。该 bean 由框架自动声明并管理 这些容器的生命周期;它会自动启动任何将 autoStartup 设置为 true 的容器。由所有容器工厂 创建的所有容器必须处于相同的 phase。有关更多信息,请参阅监听器容器自动启动。你可以使用 registry 以编程方式管理生命周期。启动或停止 registry 将启动或停止所有已注册的容器。 或者,你可以使用其 id 属性获得对单个容器的引用。你可以在注解上设置 autoStartup,它会 覆盖配置到容器工厂中的默认设置。你可以从应用上下文(例如通过自动装配)获得对该 bean 的 引用,以管理其已注册的容器。以下示例展示了如何这样做:

📄️强制 Consumer 再均衡

Kafka clients 现在支持一个触发强制再均衡的选项。从版本 3.1.2 开始,Spring for Apache Kafka 提供了一个通过消息监听器容器在 Kafka consumer 上调用此 API 的选项。调用此 API 时,它只是提醒 Kafka consumer 触发一次强制再均衡;实际的再均衡只会在下一次 poll() 操作时发生。如果已经有一个再均衡正在进行中,调用强制再均衡是一个 NO-OP。 调用者必须等待当前再均衡完成后才能再调用另一个。有关详情,请参阅 enforceRebalance 的 javadoc。

📄️按顺序启动 @KafkaListener

一个常见用例是:在另一个监听器消费完某个主题中的所有记录之后再启动一个监听器。例如, 你可能想在处理来自其他主题的记录之前,将一个或多个压缩主题的内容加载到内存中。 从版本 2.7.3 开始,引入了一个新组件 ContainerGroupSequencer。它使用 @KafkaListener 的 containerGroup 属性将容器分组在一起,并在当前组中的所有容器都转为空闲时启动下一组中的 容器。