我可能忽略了卡夫卡消费者的观点,但我想做的是:
消费者订阅主题,抓取主题中的所有消息并返回带有所有这些消息列表的Future
我试图完成此操作的代码是
val sink = Sink.fold[List[KafkaMessage], KafkaMessage](List[KafkaMessage]()) { (list, kafkaMessage) =>
list :+ kafkaMessage
}
def consume(topic: String) =
Consumer.committableSource(consumerSettings, Subscriptions.topics(topic))
.map { message =>
logger.info(s"Consuming ${message.record.value}")
KafkaMessage(Some(message.record.key()), Some(message.record.value()))
}
.buffer(bufferSize, overflowStrategy)
.runWith(sink)
未来永远不会返回,它会消耗必要的消息,然后继续反复轮询该主题。有没有办法返回Future然后关闭消费者?
答案 0 :(得分:1)
由于Kafka用于流数据,因此不存在“所有消息”,因为新数据可以随时附加到主题。
我想,你可以做两件事:
poll
返回的记录数,并终止或endOffsets
获取“当前日志结束”并将其与每个分区的最新记录的偏移量进行比较。如果两者都匹配,则可以返回。第一种方法更简单,但可能有缺点,它不如第二种方法可靠。从理论上讲,即使有可用的记录,民意调查也可以返回零记录(即使这种情况发生的变化不是很高)。
不确定,如何在Scala中表达这种终止条件(因为我对Scala不是很熟悉)。