私はスカラに再帰的な再試行関数を書いています。将来の作成時に実行時エラーがあるかどうかを知りたいと思っています。その場合、将来のインスタンス化が再試行されます。スカラ再帰関数の戻り値の型が
は、私は、データベースクエリ機能を持っている想像:
dbLookup(userId : UserId) : Option[UserName] = ???
再試行は、フォームのようなものになります:
retry[T](f :() => Future[Option[T]],
notifyFailure : (t : Throwable) => Unit,
n : Int) : Future[Option[T]] = {
if(n <= 0) { Future{None} }
else {
val fut = f()
if(f.resultsInException) { //I don't know how to write this
notifyFailure(f.exception)
retry(f, notifyFailure, n-1) //try again
}
else {
f.originalValueAsFuture
}
}
}
はどのようにこの将来の機能が実装され、末尾再帰の最適化を可能にすることができますか?
この関数は、実行コンテキストは、私が将来を作成しようとすると例外をスローし続ける場合は、ユーザーのためのデータベースを10回再試行するために使用することができ:
val userNameAfterRetries =
retry(() => Future{dbLookup("1234")},
(t) => system error (s"future creation error : $t"),
10)
注:これは可能性の一種でありますFuture.fallbackTo
ですが、残念ながらfallbackToは() => Future[T]
ではなくFuture[T]
になります。これは、最初の試行が成功した場合でも、fallbackToを使用すると余分な時間が少なくとも1回は再試行されるため、重要です。
お気軽にご相談ください。
Futureから「onFailure」を使用できますか?多分私は何かを見逃しているでしょうか? – Jegan
@Jegan 'onFailure'は、失敗した場合に実行するnotifyFailureを「登録」できますが、再試行の値を返す必要があります... –