跳到主要内容
版本:4.1.1

使用 Spring for Apache Kafka

Doubao 中英对照 Using Spring for Apache Kafka

本节详细阐述影响使用 Spring for Apache Kafka 的各种关注点。如需快速但较粗略的介绍,请参阅 Quick Tour。

章节小结​

📄️恰好一次语义

你可以为监听容器提供一个 KafkaAwareTransactionManager 实例。如此配置后,容器在调用 监听器之前开启一个事务。监听器执行的任何 KafkaTemplate 操作都参与该事务。如果监听器 成功处理了记录(在使用 BatchMessageListener 时为多条记录),容器会在事务管理器提交 事务之前,通过 producer.sendOffsetsToTransaction() 将偏移量发送到事务中。如果监听器 抛出异常,事务将回滚,消费者被重新定位,以便在下一次轮询时取回被回滚的记录。更多信息 以及对反复失败记录的处理,请参见回滚后处理器。

📄️暂停和恢复监听容器

2.1.3 版本向监听容器添加了 pause() 和 resume() 方法。此前,你可以在 ConsumerAwareMessageListener 内暂停消费者,并通过监听 ListenerContainerIdleEvent 来恢复它,该事件提供了对 Consumer 对象的访问。虽然你可以使用事件监听器在空闲容器中 暂停消费者,但在某些情况下这并不是线程安全的,因为无法保证事件监听器在消费者线程上被 调用。要安全地暂停和恢复消费者,你应使用监听容器上的 pause 和 resume 方法。 pause() 在下一次 poll() 之前立即生效;resume() 在当前 poll() 返回之后立即生效。当 容器被暂停时,它会继续对消费者进行 poll(),如果使用了消费者组管理则避免再均衡,但不会 检索任何记录。更多信息请参阅 Kafka 文档。

📄️在监听容器上暂停和恢复分区

从 2.7 版本开始,你可以通过监听容器中的 pausePartition(TopicPartition topicPartition) 和 resumePartition(TopicPartition topicPartition) 方法,暂停和 恢复分配给该消费者的特定分区的消费。暂停和恢复分别发生在 poll() 之前和之后,类似于 pause() 和 resume() 方法。如果已请求暂停某个分区,isPartitionPauseRequested() 方法返回 true。如果该分区已实际被暂停,isPartitionPaused() 方法返回 true。