我在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;
}
}
答案 0 :(得分:0)
侦听器容器创建使用者,进行订阅并负责轮询。
启用DEBUG日志记录应有助于确定问题所在。
如果记录已在主题中,则需要将ConsumerConfig.AUTO_OFFSET_RESET_CONFIG
设置为earliest
。否则,消费者将从主题结尾(latest
)开始消费。