在嘗試在 application.yml 中使用偵聽器配置屬性時,我遇到了一個問題,如果我使用 application.yml 配置(listener.type= batch),則根本不會呼叫 KafkaListener 注釋方法。只有當我在代碼中將 setBatchListener 顯式設定為 true 時才會呼叫它。這是我的代碼和配置。
- 消費者代碼:
@KafkaListener(containerFactory = "kafkaListenerContainerFactory",
topics = "${spring.kafka.template.default-topic}",
groupId = "${spring.kafka.consumer.group-id}")
public void receive(List<ConsumerRecord<String,byte[]>> consumerRecords,Acknowledgment acknowledgment){
processor.process(consumerRecords,acknowledgment);
}
- 應用程式.yml:
listener:
missing-topics-fatal: false
type: batch
ack-mode: manual
消費者配置:
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>(); factory.setConsumerFactory( new DefaultKafkaConsumerFactory<>(kafkaProperties.buildConsumerProperties())); factory.setErrorHandler(new SeekToCurrentErrorHandler( new UpdateMessageErrorHandler(),new FixedBackOff(idleEventInterval,maxFailures))); final ContainerProperties properties = factory.getContainerProperties(); properties.setIdleBetweenPolls(idleBetweenPolls); properties.setIdleEventInterval(idleEventInterval); return factory;}
uj5u.com熱心網友回復:
如果我沒記錯的話,通過ConcurrentKafkaListenerContainerFactory在配置中使用構建器,您實際上是在覆寫通常ConcurrentKafkaListenerContainerFactoryConfigurer在 spring 自動配置包中的類中執行的一段代碼:
if (properties.getType().equals(Type.BATCH)) {
factory.setBatchListener(true);
factory.setBatchErrorHandler(this.batchErrorHandler);
} else {
factory.setErrorHandler(this.errorHandler);
}
既然它application.yaml無論如何都是硬編碼在你的檔案中的,為什么在你的檔案中配置它是一件壞事@Configuration?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/452752.html
