java - 使用 Akka http 处理 HttpResponse 404 上的重试逻辑

标签 java scala akka httpresponse akka-http

我正在尝试实现一个向外部 REST 端点发出请求的代码,当该端点返回 404 时,它应该重试有限次。

HttpRequest 类似于

val responseFuture = Http().singleRequest(HttpRequest(method = requestMethod,
    uri = url,
    entity = HttpEntity(requestBody).withContentType(ContentTypes.`application/json`)
))

并且响应被处理为

responseFuture.onComplete {
    case Success(r) =>
      if (r.status.isFailure()) Future.failed(new Exception("request failed with status 404"))
      else r
    case Failure(e) => throw e
}

我的重试逻辑是:

def retryFuture[T](retries: Int, delay: FiniteDuration = 1.second)(fn: => Future[T])(implicit ec: ExecutionContext, s: Scheduler): Future[T] = {
    fn.recoverWith {
      case _ if retries > 0 => after(delay, s)(retryFuture(retries - 1, delay)(fn))
    }
}

问题是当端点返回 404 时,它以 SUCCESS(HttpResponse(404,...) 的形式出现,因此重试不起作用。任何人都可以指出可以采取什么措施来解决此问题吗?

最佳答案

您应该将 responseFuture 定义为 def 而不是 val,以便能够多次运行它。

然后,您只需执行 responseFuture.filter(_.status.isSuccess()) 即可在 404 返回代码(实际上是所有错误代码)上获得 Future.failed

您现在可以对此使用恢复策略。

关于java - 使用 Akka http 处理 HttpResponse 404 上的重试逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42984542/

相关文章:

java - 在我的 Gradle Java 项目中使用本地 jar 作为依赖项

Java Zookeeper API 奇怪的 ZNode 行为。无法正确删除ZNode。它有意想不到的结果

java - 为什么 ForkJoinPool 使用 ThreadPerTaskExecutor?

scala - 需要帮助实现阻止有界邮箱

java - 为什么eclipse中仍然不显示汉字?

java - Google Play 游戏服务 showAchievments()

java - 向二叉树中插入一个元素

scala - 分别处理spark中的多个目录

scala - IntelliJ 哪一招不是已经用过了?

scala - 如何创建一个可以稍后通过方法调用接收元素的 Source?