寻找一个在Spring Kafka 2.1.0中使用自定义ConsumerAwareRebalanceListener的工作示例

时间:2018-01-31 02:19:40

标签: spring-kafka

根据文件:

  

ContainerProperties有一个属性consumerRebalanceListener   采用Kafka客户端的实现   ConsumerRebalanceListener接口。如果没有提供此属性,   容器将配置一个记录的简单日志记录侦听器   在INFO级别下重新平衡事件。该框架还增加了一个   子接口ConsumerAwareRebalanceListener [...]

然而,实际上将自定义重新平衡侦听器分配给ContainerProperties似乎不是注入点或生命周期阶段。

在我的情况下,我使用自动配置,而bean主要由KafkaAnnotationDrivenConfigurationKafkaAutoConfiguration提供。

与许多Spring类和组件不同,没有办法通过定义某种类型的bean来设置自定义重新平衡侦听器,唯一的选择似乎是对现有bean进行黑客攻击和子类化。

或者我在这里缺少什么东西?

1 个答案:

答案 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) {