消费者类侦听器方法未触发以接收来自主题的消息。 Kafka与Spring Boot App

时间:2020-10-29 07:41:54

标签: spring-boot apache-kafka spring-kafka

我在Spring Boot中使用Kafka。我使用Rest Controllers调用Producer / Consumer API。生产者类可以向主题添加消息。我使用命令行实用程序(Console-consumer.sh)进行了验证。但是,我的Consumer类无法使用Java接收它们以进行进一步处理。 当我的Producer类将消息发布到未发生的主题时,Consumer类侦听器方法中使用的@KafkaListener应该能够接收消息。任何帮助表示赞赏。

当我已经创建了KafkaListenerContainerFactory来负责将消息发布到主题时调用Consumer Listener方法时,消费者是否仍然需要订阅和轮询记录?

消费阶层

@Component
public class KafkaListenersExample {

    private final List<KafkaPayload> messages = new ArrayList<>();

    @KafkaListener(topics = "test_topic", containerFactory = "kafkaListenerContainerFactory")
    public void listener(KafkaPayload data) {
        synchronized (messages){
            messages.add(data);
        }
        //System.out.println("message from kafka :"+data);
    }

    public List<KafkaPayload> getMessages(){
        return messages;
    }
}

消费者配置

@Configuration
class KafkaConsumerConfig {

    private String bootstrapServers = "localhost:9092";
 

    @Bean
    public ConsumerFactory<String, KafkaPayload> consumerConfigs() {
        Map<String, Object> props = new HashMap<>();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,
                bootstrapServers);
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, JsonDeserializer.class);
        return new DefaultKafkaConsumerFactory<>(props) ;
    }

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

1 个答案:

答案 0 :(得分:0)

侦听器容器创建使用者,进行订阅并负责轮询。

启用DEBUG日志记录应有助于确定问题所在。

如果记录已在主题中,则需要将ConsumerConfig.AUTO_OFFSET_RESET_CONFIG设置为earliest。否则,消费者将从主题结尾(latest)开始消费。