我想搬家:
val kafkaPartitionOffset = kafkaConsumer.endOffsets(consumedPartitions.asJava)进入try catch块,如下所示:
val kafkaPartitionOffset : SomeClass =
try {
kafkaConsumer.endOffsets(consumedPartitions.asJava)
} catch {
case e: Exception => {
log.error(s"${consumerGroupId} Could not get Kafka offset", e)
None
}
}但是我在SomeClass应该是什么的问题上有困难。我试过Map[TopicPartition, Long],但上面写着Type mismatch。任何帮助都是感激的,谢谢!
更新:,我也尝试过Any,但是我无法在下面执行kafkaPartitionOffset.get(topicPartition) (get用错误消息cannot resolve symbol get高亮显示
for((topicPartition,OffsetAndMetadata) <- mapTopicPartitionOffset){
val bbCurrentOffset = OffsetAndMetadata.get(topicPartition)
// latest offset
val partitionLatestOffset = kafkaPartitionOffset.get(topicPartition)
// Log for a particular partition
val delta = partitionLatestOffset - bbCurrentOffset
topicOffsetList += delta.abs
}发布于 2022-05-20 21:15:27
看一看这个:
val x = try {
throw new RuntimeException("runtime ex")
"some string"
} catch { case _: RuntimeException => 2 }编译器需要在运行时之前知道x的类型,因为x可以在代码中的其他地方使用,对吗?所以编译器说:
"Hmm,这个文字“string”是那种类型的类型,而文本2是那种类型的是什么类型呢?“
所以它寻找字符串和Int的最低超级类型,在本例中是Any!所以val x: Any = ...。现在我不知道kafkaConsumer.endOffsets(...)返回的表达式是什么,如果它返回Option[T],那么SomeClass也将是Option[T],因为在catch块中不返回任何一个,如果不返回,就不要在那里使用None,因为没有其他的方法适合,有更好的异常处理方法。
但是无论如何,Scala提供了一些实用程序类型,以尽可能避免这种尝试捕获,我建议您在本例中使用Try。
val kafkaPartitionOffset: Try[Whatever-endOffsets-returns] =
Try(kafkaConsumer.endOffsets(consumedPartitions.asJava))另外,问题的标题与实际问题不符,请考虑更改标题:)
https://stackoverflow.com/questions/72324555
复制相似问题