Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add retries to POST request in akka http?

I am doing a POST request with the following akka http request side api.

   Http().singleRequest(....)

I found that akka http for post doesn't support retries.

// max-retries = 3 // AKKA http default value is 5, and it doesn't work for POST request

Then what would be the best approach for doing a retry in case of POST request .

like image 249
supernatural Avatar asked Sep 17 '25 13:09

supernatural


1 Answers

You can try something like this, based on akka.pattern.retry

object Example {

  case class RetryConfig(attempts: Int, minBackoff: FiniteDuration, maxBackoff: FiniteDuration, randomFactor: Double)

  class SingleRequestClient(implicit system: ActorSystem) {

    def request(request: HttpRequest): Future[HttpResponse] = {
      Http().singleRequest(request)
    }
  }

  object SingleRequestClient {

    def apply(implicit system: ActorSystem): SingleRequestClient = {
      new SingleRequestClient
    }

    def apply(config: RetryConfig)(implicit system: ActorSystem, ex: ExecutionContext): SingleRequestClient = {
      new SingleRequestClient {

    override def request(request: HttpRequest): Future[HttpResponse] = {
      akka.pattern.retry(
        attempt = () => super.request(request),
        attempts = config.attempts,
        minBackoff = config.minBackoff,
        maxBackoff = config.maxBackoff,
        randomFactor = config.randomFactor
      )(ex, system.scheduler)
    }
      }
    }
  }
}

Additionally, You should set max-retries to 0.

Ofc it works only with Future.failed so if you want to retry request on status != 200, you can change the basic implementation a little

  class SingleRequestClient(implicit system: ActorSystem, ex: ExecutionContext) {

    def request(request: HttpRequest): Future[HttpResponse] = {
      Http().singleRequest(request).map {
        case res: HttpResponse if res.status.isSuccess => res
        case res: HttpResponse if res.status.isFailure =>
          throw new Exception(s"Cannot process request dou to ${res.status.intValue} status")
      }
    }
  }
like image 158
mForest Avatar answered Sep 19 '25 07:09

mForest