我在项目中使用的是Spring Kafka,我想在消费者根据键和值消费之前过滤消息。
有可能吗?
答案 0 :(得分:5)
是的,在春季Kafka中,您可以在消费者消费之前过滤消息,接口public interface RecordFilterStrategy<K,V>
中有一个接口boolean filter(org.apache.kafka.clients.consumer.ConsumerRecord<K,V> consumerRecord)
和方法
因此您需要覆盖此filter
方法,如果返回false,则使用者将消耗消息,如果返回true,则将不使用消息
您可以将此过滤应用于消息以及消息值
consumerRecord.key() // will return key of message
consumerRecord.value() // will return the message
示例代码:
@Bean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<String, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConcurrency(Integer.parseInt(threads));
factory.setBatchListener(true);
factory.setConsumerFactory(kafkaConsumerFactory());
factory.getContainerProperties().setPollTimeout(Long.parseLong(pollTimeout));
factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.BATCH);
if(true) {
factory.setRecordFilterStrategy(new RecordFilterStrategy<String, String>() {
@Override
public boolean filter(ConsumerRecord<String, String> consumerRecord) {
if(consumerRecord.key().equals("ETEST")) {
return false;
}
else {
return true;
}
}
});
}
return factory;
}
答案 1 :(得分:1)
添加到@Deadpool注释。它将正常工作,但不会提交偏移量。因此我们将再次收到相同的消息,但不会被使用。我们需要先设置factory.setAckDiscarded(true);
,然后再设置factory.setRecordFilterStrategy()
,以使其丢弃并提交偏移量。