根据文件:
ContainerProperties有一个属性consumerRebalanceListener 采用Kafka客户端的实现 ConsumerRebalanceListener接口。如果没有提供此属性, 容器将配置一个记录的简单日志记录侦听器 在INFO级别下重新平衡事件。该框架还增加了一个 子接口ConsumerAwareRebalanceListener [...]
然而,实际上将自定义重新平衡侦听器分配给ContainerProperties
似乎不是注入点或生命周期阶段。
在我的情况下,我使用自动配置,而bean主要由KafkaAnnotationDrivenConfiguration
和KafkaAutoConfiguration
提供。
与许多Spring类和组件不同,没有办法通过定义某种类型的bean来设置自定义重新平衡侦听器,唯一的选择似乎是对现有bean进行黑客攻击和子类化。
或者我在这里缺少什么东西?
答案 0 :(得分:0)
您需要ConcurrentKafkaListenerContainerFactoryConfigurer
进行扩展,请致电super.configure()
并使用:
ContainerProperties containerProperties = listenerContainerFactory
.getContainerProperties();
访问@KafkaListener
的容器属性。已经在那里你可以注入你的RebalanceListener
。
正确:必须将自定义ConcurrentKafkaListenerContainerFactoryConfigurer
声明为@Bean
:
@Bean
public ConcurrentKafkaListenerContainerFactoryConfigurer kafkaListenerContainerFactoryConfigurer(
ConsumerAwareRebalanceListener rebalanceListener) {
return new ConcurrentKafkaListenerContainerFactoryConfigurer() {
@Override
public void configure(ConcurrentKafkaListenerContainerFactory<Object, Object> listenerContainerFactory,
ConsumerFactory<Object, Object> consumerFactory) {
super.configure(listenerContainerFactory, consumerFactory);
listenerContainerFactory.getContainerProperties()
.setConsumerRebalanceListener(rebalanceListener);
}
};
}
确实从KafkaAnnotationDrivenConfiguration
构建kafkaListenerContainerFactory
bean使用了这个bean:
@Bean
@ConditionalOnMissingBean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
ConsumerFactory<Object, Object> kafkaConsumerFactory) {