akka.pattern.RetrySupport

さんぷるのりとらい

  def retry[T](f: => Future[T]): Future[T] = {
    @tailrec
    def retry0(errors: List[Throwable], f: => Future[T]): Future[T] = {
      f.recoverWith {
        case e  => run(e :: errors, f)
      }
    }
    run(Nil, f)
  }

末尾再帰になってない
Future非同期だから

could not optimize @tailrec annotated method run: it contains a recursive call not in tail position

どうする

RetrySupportなるものがあったakka.pattern.RetrySupport

  def retry[T](attempt: () ⇒ Future[T], attempts: Int, delay: FiniteDuration)(implicit ec: ExecutionContext, scheduler: Scheduler): Future[T] = {
    try {
      if (attempts > 0) {
        attempt() recoverWith {
          case NonFatal(_) ⇒ after(delay, scheduler) {
            retry(attempt, attempts - 1, delay)
          }
        }
      } else {
        attempt()
      }
    } catch {
      case NonFatal(error) ⇒ Future.failed(error)
    }
  }

attempt リトライする処理
attemnpts リトライする回数
delay リトライ間隔 ec: ExecutionContext いつものやつ scheduler: Scheduler わからん <= あとでしらべる

つかう

  def retry[T](f: => Future[T]): Future[T] = {
    implicit val sc: Scheduler = actorSystem.scheduler
    RetrySupport.retry(() => f, config.secureRetryLimit, 1.second)
  }

actorSystemとはったい <= しらべる