springboot手动提交kafka offset

enable.auto.commit参数设置成了false

但是测试发现enable.auto.commit参数设置成了false,kafka的offset依然提交了(也没有进行人工提交offset)。

查看源码

如果我们enable.auto.commit设置为false,那么就会走标红的if语句。而且下面有个stopInvokerAndCommitManualAcks()方法,看名字就知道是人工提交的意思。那么我们进去stopInvokerAndCommitManualAcks()方法瞅瞅。 

如上图所示有个processCommits()方法,那么继续追进去: 

单单看标红的方法是不是就知道这方法里面是更新offset和提交offset的方法。那么我们继续追进去:


结论:如果我们把enable.auto.commit参数设置成true。那么offset交给kafka来管理,offset进行默认的提交模式。 
enable.auto.commit参数设置成false。那么就是Spring来替为我们做人工提交,从而简化了人工提交的方式。 
所以kafka和springboot结合中的enable.auto.commit为false为spring的人工提交模式。enable.auto.commit为true是采用kafka的默认提交模式。 

手动提交

spring.kafka.consumer.enable-auto-commit设置为false,设置AckMode的值

 /**
     * The offset commit behavior enumeration.
     */
    public enum AckMode {

        /**
         * Commit after each record is processed by the listener.
         */
        RECORD,

        /**
         * Commit whatever has already been processed before the next poll.
         */
        BATCH,

        /**
         * Commit pending updates after
         * {@link ContainerProperties#setAckTime(long) ackTime} has elapsed.
         */
        TIME,

        /**
         * Commit pending updates after
         * {@link ContainerProperties#setAckCount(int) ackCount} has been
         * exceeded.
         */
        COUNT,

        /**
         * Commit pending updates after
         * {@link ContainerProperties#setAckCount(int) ackCount} has been
         * exceeded or after {@link ContainerProperties#setAckTime(long)
         * ackTime} has elapsed.
         */
        COUNT_TIME,

        /**
         * User takes responsibility for acks using an
         * {@link AcknowledgingMessageListener}.
         */
        MANUAL,

        /**
         * User takes responsibility for acks using an
         * {@link AcknowledgingMessageListener}. The consumer is woken to
  • RECORD
    每处理一条commit一次
  • BATCH(默认)
    每次poll的时候批量提交一次,频率取决于每次poll的调用频率
  • TIME 
    每次间隔ackTime的时间去commit
  • COUNT 
    累积达到ackCount次的ack去commit
  • COUNT_TIME
    ackTime或ackCount哪个条件先满足,就commit
  • MANUAL
    listener负责ack,但是背后也是批量上去
  • MANUAL_IMMEDIATE
    listner负责ack,每调用一次,就立即commit

manual commit

@KafkaListener(topics = "k010")
    public void listen(ConsumerRecord<?, ?> cr,Acknowledgment ack) throws Exception {
        LOGGER.info(cr.toString());
        ack.acknowledge();
    }

方法参数里头传递Acknowledgment,然后手工ack

如果只添加上面语句会报错:

the listener container must have a MANUAL Ackmode to populate the Acknowledgment

我们要配置AckMode为MANUAL Ackmode

factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL);

 

转载于:https://my.oschina.net/u/2000675/blog/3002340

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 应用中,要配置 Kafka 参数,可以在 application.yml 或 application.properties 文件中添加以下配置: ``` spring.kafka.bootstrap-servers=服务器地址 spring.kafka.consumer.group-id=消费者组ID spring.kafka.consumer.auto-offset-reset=earliest/latest/none spring.kafka.consumer.enable-auto-commit=true/false spring.kafka.consumer.key-deserializer=键反序列化器类名 spring.kafka.consumer.value-deserializer=值反序列化器类名 spring.kafka.producer.key-serializer=键序列化器类名 spring.kafka.producer.value-serializer=值序列化器类名 ``` 其中,各个参数的含义如下: - spring.kafka.bootstrap-servers:Kafka 服务器地址,多个地址使用逗号分隔。 - spring.kafka.consumer.group-id:消费者组 ID。 - spring.kafka.consumer.auto-offset-reset:消费者在找不到 offset 初始值或 offset超出范围时的行为。可选值为 earliest、latest 和 none,默认为 latest。 - spring.kafka.consumer.enable-auto-commit:是否开启自动提交 offset。如果开启,每隔一段时间会自动提交 offset,否则需要手动提交。 - spring.kafka.consumer.key-deserializer:键的反序列化器类名,通常为 org.apache.kafka.common.serialization.StringDeserializer。 - spring.kafka.consumer.value-deserializer:值的反序列化器类名,通常为 org.apache.kafka.common.serialization.StringDeserializer。 - spring.kafka.producer.key-serializer:键的序列化器类名,通常为 org.apache.kafka.common.serialization.StringSerializer。 - spring.kafka.producer.value-serializer:值的序列化器类名,通常为 org.apache.kafka.common.serialization.StringSerializer。 这些配置可以根据具体需要进行调整,例如,可以使用自定义的序列化器和反序列化器来处理复杂的数据类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值