我正在开发一个使用kafka的scala应用程序。我的kafka客户代码如下。
def getValues(topic: String): String = {
val props = new Properties()
props.put("group.id", "test")
props.put("bootstrap.servers", "localhost:9092")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("auto.offset.reset", "earliest")
val consumer: KafkaConsumer[String, String] = new KafkaConsumer[String, String](props)
val topicPartition = new TopicPartition(topic, 0)
consumer.assign(util.Collections.singletonList(topicPartition))
val offset = consumer.position(topicPartition) - 1
val record = consumer.poll(Duration.ofMillis(500)).asScala
for (data <- record)
if(data.offset() == offset) val value = data.value()
return value
}
在此,我只想返回最新值。当我运行我的应用程序时,我得到以下日志:
Resetting offset for partition topic-0 to offset 0
由于val offset = consumer.position(topicPartition) - 1
变为-1,而data.offset()给出所有偏移量的列表。结果,我没有得到最新的价值。为什么将偏移量自动重置为0?我该如何纠正?我的代码有什么错误?或者以其他方式可以从最新的偏移量中获取值?
答案 0 :(得分:1)
您正在寻找一种seek
方法-根据JavaDocs-“将覆盖使用者将在下一次轮询(超时)时使用的提取偏移量”。
还要确保您正在设置
props.put("auto.offset.reset", "latest")
对您的代码进行了这两项修改,以下代码对我有用:仅提取所选主题中部分value
的最新偏移量的0
:
import java.time.Duration
import java.util.Properties
import org.apache.kafka.clients.consumer.KafkaConsumer
import org.apache.kafka.common.TopicPartition
import collection.JavaConverters._
def getValues(topic: String): String = {
val props = new Properties()
props.put("group.id", "test")
props.put("bootstrap.servers", "localhost:9092")
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer")
props.put("auto.offset.reset", "latest")
val consumer: KafkaConsumer[String, String] = new KafkaConsumer[String, String](props)
val topicPartition = new TopicPartition(topic, 0)
consumer.assign(java.util.Collections.singletonList(topicPartition))
val offset = consumer.position(topicPartition) - 1
consumer.seek(topicPartition, offset)
val record = consumer.poll(Duration.ofMillis(500)).asScala
for (data <- record) {
val value: String = data.value() // you are only reading one message if no new messages flow into the Kafka topic
}
value
}
答案 1 :(得分:0)
在此行props.put("auto.offset.reset", "earliest")
中,将Kafka使用者的参数auto.offset.reset
设置为earliest
,这会将偏移量最早重置。如果要使用最新值,则应改用latest
。
您可以找到文档here。