springboot配置手动提交_springboot手动提交kafka offset

本文探讨了SpringBoot中Kafka消费者配置的enable.auto.commit参数,当设置为false时,Spring会接管offset提交。通过源码分析,解释了Spring如何实现人工提交,并提供了手动提交的配置和示例代码。介绍了不同AckMode的含义和使用场景。
摘要由CSDN通过智能技术生成

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

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

查看源码springboot

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

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

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

结论:若是咱们把enable.auto.commit参数设置成true。那么offset交给kafka来管理,offset进行默认的提交模式。

enable.auto.commit参数设置成false。那么就是Spring来替为咱们作人工提交,从而简化了人工提交的方式。

因此kafka和springboot结合中的enable.auto.commit为false为spring的人工提交模式。enable.auto.commit为true是采用kafka的默认提交模式。 blog

手动提交

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

/**

* 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,而后手工ackkafka

若是只添加上面语句会报错:源码

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

咱们要配置AckMode为MANUAL Ackmodeit

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值