在Spring中消费Kafka消息

时间:2018-06-09 18:21:55

标签: spring-boot apache-kafka

通过遵循此tutorial,我能够创建一个简单的生产者 - 消费者示例。在我的例子中,只有一个主题,我正在听这个话题。出于这个原因,ReceiverConfig中的代码是有道理的。特别是GROUP_ID_CONFIG周围的点,即我创建主题topic_name,然后在此配置中配置它。现在我的问题是,如果我有一个以上的话题怎么办?我们说我有topic_1topic_2等等?我应该为每个主题创建ReceiverConfig吗?

@EnableKafka
@Configuration
public class ReceiverConfig {
    @Value("${spring.kafka.bootstrap-servers}")
    private String bootstrapServers;

    @Bean
    public Map<String, Object> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
        props.put(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(GROUP_ID_CONFIG, "topic_name");
        props.put(AUTO_OFFSET_RESET_CONFIG, "earliest");

        return props;
    }

    @Bean
    public ConsumerFactory<String, String> consumerFactory() {
        return new DefaultKafkaConsumerFactory<>(consumerConfigs());
    }

    @Bean
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<String, String>> kafkaListenerContainerFactory() {
        ConcurrentKafkaListenerContainerFactory<String, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }
}

1 个答案:

答案 0 :(得分:1)

简短的回答是否定的,您不需要为每个主题创建多个配置。

在进一步讨论之前,我认为有必要指定groupId是Consumer进程所属的组,而Consumer进程使用的topic是两个不同的东西。

使用下面的句子,您将告诉消费者它属于 topic_name 组,仅此而已。

props.put(GROUP_ID_CONFIG, "topic_name");

如果您希望消费者从多个主题中读取数据,则有subscribe方法接收集合作为参数,这样您就可以指定所有主题来读取数据,而无需创建新配置对于每个主题。

请查看此示例,您将看到我提到的方法

// Subscribe to the topic.
consumer.subscribe(Collections.singletonList(TOPIC));