目標:- 從 aws s3 存盤桶中檢索 json 物件。重試失敗。如果重試嘗試已用盡,請將錯誤訊息發送到 azure 的事件中心。
//重試函式
def retry[T](n: Int, id: String)(fn: => T): Option[T] = {
Try(fn) match {
case Success(x) => Some(x)
case Failure(e) => {
Thread.sleep(1000)
if (n > 1) {
retry(n - 1, id)(fn)
} else {
val eMessage = "TransactionId =" id " : ".concat(e.toString())
SendMessage(eMessage, event_hub_client)
None
}
}
}
}
//從 aws s3 存盤桶中檢索物件的主函式(帶有上述重試)
def getS3Object(s3ObjectName: String, s3Client: AmazonS3, evtClient: EventHubClient): String = {
retry(2,s3ObjectName) {
val inputS3Stream = s3Client.getObject("my_s3_bucket", s3ObjectName).getObjectContent
val inputS3String = IOUtils.toString(inputS3Stream, "UTF-8")
return inputS3String
}
}
我收到以下編譯失敗訊息:-
錯誤:發現型別不匹配
:Option[Nothing]
required: String
retry2(2,s3ObjectName)
如何宣告 retry 和 main 函式的回傳型別以使它們匹配?
uj5u.com熱心網友回復:
在型別方面retry看起來還可以。你需要調整你的其他方法。
如果您想回退到其他值,請使其回傳 aOption[String]或使用。getOrElse(..)
def getS3Object(s3ObjectName: String, s3Client: AmazonS3, evtClient: EventHubClient): Option[String] = {
retry(2,s3ObjectName) {
val inputS3Stream = s3Client.getObject("my_s3_bucket", s3ObjectName).getObjectContent
val inputS3String = IOUtils.toString(inputS3Stream, "UTF-8")
inputS3String
}
}
請注意洗掉了return無用的關鍵字,并且不會像您認為的那樣做(我會讓您自己搜索該主題)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/474423.html
上一篇:從案例類串列中的元素創建地圖
下一篇:如何以編程方式執行Scala測驗
