我想搬家:
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
}
uj5u.com熱心網友回復:
看看這個:
val x = try {
throw new RuntimeException("runtime ex")
"some string"
} catch { case _: RuntimeException => 2 }
編譯器需要x
在運行前知道型別,因為x
可以在代碼的其他地方使用,對吧?所以編譯器說:
“嗯,這個字面量“某個字串”屬于那種型別,而且字面量 2 屬于那種型別是什么型別?”
所以它會尋找 String 和 Int 的最低超型別,Any
在這種情況下就是這樣!所以val x: Any = ...
。現在我不知道這個運算式kafkaConsumer.endOffsets(...)
回傳什么,如果它回傳Option[T]
,那么 SomeClass 也將是Option[T]
因為你在 catch 塊中回傳 None ,如果沒有,不要在那里使用 None ,因為沒有其他東西適合,那里是更好的例外處理方法。
但無論如何,Scala 提供了一些實用程式型別來盡可能避免這種 try catch,我建議你Try
在這種情況下使用。
val kafkaPartitionOffset: Try[Whatever-endOffsets-returns] =
Try(kafkaConsumer.endOffsets(consumedPartitions.asJava))
順便說一句,問題的標題與實際問題不匹配,請考慮更改標題:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/480336.html
上一篇:Scala:如何將其他字母大寫