@KafkaListener为每个侦听器提供单独的过滤逻辑

时间:2020-03-20 07:55:46

标签: spring apache-kafka spring-kafka

我需要为侦听器工厂生产的每个侦听器定义自定义过滤策略。 目前,我正在使用RecordFilterStrategy来做到这一点:

@Bean
ConcurrentKafkaListenerContainerFactory<String, GenericRecord> kafkaListenerContainerFactoryProject() {
    ConcurrentKafkaListenerContainerFactory<String, GenericRecord> factory = new ConcurrentKafkaListenerContainerFactory<>();
    factory.setConsumerFactory(consumerFactory());
    factory.setRecordFilterStrategy(new RecordFilterStrategy<String, GenericRecord>() {
        @Override
        public boolean filter(ConsumerRecord<String, GenericRecord> consumerRecord) {
          return true;
        }
    });
    return factory;
}

但是这种过滤适用于该工厂产生的所有侦听器。我需要的是为每个侦听器定义不同的逻辑的方法:

@Component
@SendTo("out")
@KafkaListener(topics = "incoming")
public class TestListener {

    @Filter
    public boolean filter(){
        return true;
    }

    @KafkaHandler
    public TestObject listener(TestObject testObject) {
        log.debug("Received Message: " + testObject);
        return testObject;
    }

}

spring-kafka是否有一些工具可以做到这一点?还是我需要自己编写这样的逻辑?

谢谢!

1 个答案:

答案 0 :(得分:2)

不,你不知道。您只需要一组ConcurrentKafkaListenerContainerFactory豆,其中包含特定的RecordFilterStrategy。然后,您的@KafkaListener应该只指定它们基于的工厂:

/**
 * The bean name of the {@link org.springframework.kafka.config.KafkaListenerContainerFactory}
 * to use to create the message listener container responsible to serve this endpoint.
 * <p>If not specified, the default container factory is used, if any.
 * @return the container factory bean name.
 */
String containerFactory() default "";