如果您查看官方文档(https://docs.spring.io/spring-kafka/reference/kafka/receiving-messages/listener-annotation.html)和互联网上几乎所有的示例,Sping Boot 中的 KafkaListenerContainerFactory 是这样配置的:
@Configuration
@EnableKafka
public class KafkaConfig {
@Bean
KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
factory.setConcurrency(3);
factory.getContainerProperties().setPollTimeout(3000);
return factory;
}
@Bean
public ConsumerFactory<Integer, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
}
字符串
请注意,kafkaListenerContainerFactory() 方法不是接受 ConsumerFactory bean作为参数,而是调用 consumerFactory() 方法,创建 ConsumerFactory 类的第二个示例,并破坏在此方法旁边声明的bean的目的。
为什么要这样做?
1条答案
按热度按时间pinkon5k1#
这是不正确的。如果你使用
@Configuration
而不使用proxyBeanMethods = false
:字符串
然后这个类中的所有
@Bean
方法都被代理,每当我们调用它们时,示例只创建一次。参数注入确实更好,因为我们不通过代理,但这已经超出了Spring for Apache Kafka的范围。我相信那些bean方法调用风格的示例更适合理解而不是性能等。
这也是一个事实,使用Sping Boot ,你可能不需要那些工厂bean,因为它们只是自动配置的。然而,这并不意味着你总是使用Sping Boot 。因此,普通的Spring for Apache Kafka示例往往充满了信息。