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
とはったい <= しらべる