springboot配置手动提交_springboot手动提交kafka offset-Go语言中文社区

本文探讨了SpringBoot中配置Kafka消费者时,将`enable.auto.commit`设置为`false`的情况。当该参数设为`false`时,Spring会接管offset的提交,简化手动提交过程。详细讲解了不同`AckMode`的工作原理,包括`RECORD`、`BATCH`、`TIME`、`COUNT`、`COUNT_TIME`、`MANUAL`和`MANUAL_IMMEDIATE`,并提供了使用`Acknowledgment`手动提交offset的示例代码。
摘要由CSDN通过智能技术生成

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值