我正在尝试在我的Spring Boot项目中使用spring-kafka从kafka中读取消息。我正在使用@KafkaListener,但问题是我的使用者始终在运行。一旦我从控制台产生一条消息,它就会在我的应用程序中弹出。我想定期轮询。我该如何实现?
@Service
public class KafkaReciever {
private static final Logger LOGGER =
LoggerFactory.getLogger(KafkaReciever.class);
private CountDownLatch latch = new CountDownLatch(1);
public CountDownLatch getLatch() {
return latch;
}
@KafkaListener(topics = "test")
public void receive(String payload) {
LOGGER.info("received payload='{}'", payload);
latch.countDown();
}
}
这是我的使用者配置:
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
// list of host:port pairs used for establishing the initial connections to the Kafka cluster
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
// allows a pool of processes to divide the work of consuming and processing records
props.put(ConsumerConfig.GROUP_ID_CONFIG, "foo1");
// automatically reset the offset to the earliest offset
props.put(ConsumerConfig.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;
}
答案 0 :(得分:1)
这就是它的设计方式;这是一个消息驱动容器(并且与其他Spring消息传递技术抽象-RabbitMQ,JMS等保持一致)。
要仅按需获取消息,您有两种选择:
poll()
spring-integration-kafka
的{{1}}并致电KafkaMessageSource
在两种情况下,如果您都使用kafka组管理,则需要注意receive()
以避免重新平衡。
您可以使用spring集成入站通道适配器来定期轮询消息源。
答案 1 :(得分:0)
从 2.3 版本开始,添加了一个名为 idleBetweenPolls
的新属性。
从 2.3 版开始,ContainerProperties 提供了一个 idleBetweenPolls 选项,让侦听器容器中的主循环在 KafkaConsumer.poll() 调用之间休眠。从提供的选项和 max.poll.interval.ms 消费者配置与当前记录批处理时间之间的差异中选择实际睡眠间隔作为最小值。
通过这种方式,您可以在消费者轮询之间添加间隔。