启用对返回 Future 的 Scala 函数的重试

use*_*167 0 scala

我有一些返回Futures 的函数。调用者通过 注册回调onComplete

def makeHttpRequest(): Future[T] = ???
makeHttpRequest().onComplete {
  case Success(v) => ???
  case Failure(ex) => ???
}
Run Code Online (Sandbox Code Playgroud)

现在我想对这些函数(或函数调用)启用重试。有没有关于如何实现这一目标的建议?

Mar*_*lic 5

没有开箱即用的重试功能。然而,基于Retry 一个返回 Future 的函数,请考虑

def retry[T](n: Int, expr: => Future[T]): Future[T] =
  Future.unit.flatMap(_ => expr).recoverWith {
    case e if n > 1 => retry(n - 1, expr)
    case e => Future.failed(e)
  }

retry(3, makeHttpRequest())
Run Code Online (Sandbox Code Playgroud)

https://scalafiddle.io/sf/otseSX0/0

或考虑专用库,例如softwaremill/retry

  • 在第一种情况下,您需要使用 `case e if n > 1` 而不是 `case e if n > 0` 来重试 3 次而不是 4 次。 (2认同)