[英]How does spring.kafka.consumer.auto-offset-reset works in spring-kafka
KafkaProperties
Java 文檔:
/**
* What to do when there is no initial offset in Kafka or if the current offset
* does not exist any more on the server.
*/
private String autoOffsetReset;
我有包含application.properties
hello world application.properties
spring.kafka.consumer.group-id=foo
spring.kafka.consumer.auto-offset-reset=latest
在這種情況下,為所有條目調用@KafkaListener
方法。 但預期的結果是@KafkaListener
方法只為我發送的最新 3 個選項調用。 我嘗試使用另一個選項:
spring.kafka.consumer.auto-offset-reset=earlisest
但行為相同。
你能解釋一下這個東西嗎?
代碼示例:
@SpringBootApplication
public class Application implements CommandLineRunner {
public static Logger logger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args).close();
}
@Autowired
private KafkaTemplate<String, String> template;
private final CountDownLatch latch = new CountDownLatch(3);
@Override
public void run(String... args) throws Exception {
this.template.send("spring_kafka_topic", "foo1");
this.template.send("spring_kafka_topic", "foo2");
this.template.send("spring_kafka_topic", "foo3");
latch.await(60, TimeUnit.SECONDS);
logger.info("All received");
}
@KafkaListener(topics = "spring_kafka_topic")
public void listen(ConsumerRecord<?, ?> cr) throws Exception {
logger.info(cr.toString());
latch.countDown();
}
}
行為不取決於spring.kafka.consumer.auto-offset-reset
它僅取決於 spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit
如果我設置spring.kafka.consumer.enable-auto-commit=false
- 我會看到所有記錄。
如果我設置spring.kafka.consumer.enable-auto-commit=true
- 我只看到最后 3 條記錄。
請澄清 spring.kafka.consumer.auto spring.kafka.consumer.auto-offset-reset
屬性的spring.kafka.consumer.auto-offset-reset
Spring Boot 中的KafkaProperties
是這樣做的:
public Map<String, Object> buildProperties() {
Map<String, Object> properties = new HashMap<String, Object>();
if (this.autoCommitInterval != null) {
properties.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG,
this.autoCommitInterval);
}
if (this.autoOffsetReset != null) {
properties.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG,
this.autoOffsetReset);
}
這個buildProperties()
是從buildConsumerProperties()
中使用的,它依次用於:
@Bean
@ConditionalOnMissingBean(ConsumerFactory.class)
public ConsumerFactory<?, ?> kafkaConsumerFactory() {
return new DefaultKafkaConsumerFactory<Object, Object>(
this.properties.buildConsumerProperties());
}
因此,如果您使用自己的ConsumerFactory
bean 定義,請務必重用這些KafkaProperties
: https : KafkaProperties
額外道具
更新
好的。 我明白發生了什么。
嘗試添加此屬性:
spring.kafka.consumer.enable-auto-commit=false
這樣我們就不會基於某個提交間隔進行異步自動提交。
我們應用程序中的邏輯基於latch.await(60, TimeUnit.SECONDS);
之后的退出事實latch.await(60, TimeUnit.SECONDS);
. 當我們得到3
預期的記錄時,我們退出。 這樣,消費者的異步自動提交可能還不會發生。 因此,下次您運行應用程序時,消費者將從未提交的偏移量中輪詢數據。
當我們關閉自動提交時,我們有一個AckMode.BATCH
,它是同步執行的,我們能夠看到這個foo
消費者組的主題中真正最新的記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.