首页 > 解决方案 > Akka HTTP:当遇到错误的 URL 时,如何让流 Http().superPool() 不抛出异常?

问题描述

我有很多我想使用 Akka HTTP 和使用流的 URL。

URL 可能格式错误,或者 DNS 可能无法解析主机名。在这些情况下,我希望 superPool() 流简单地返回一个失败作为 Try[HTTPResponse] 而不是抛出异常并终止整个流。

我该怎么做呢?我已经搜索过了,但什么也没找到,找不到处理文档本身中的 esceptions 的方法。

编辑:再摆弄一点之后,我发现唯一的问题是 HTTPS url,即使这样流也没有关闭,但是我在控制台上打印了错误,这是不应该发生的。这是一个重现的小例子:

import akka.stream.scaladsl.{Sink, Source}    
import akka.NotUsed
import scala.util.Success
import akka.http.scaladsl.model.HttpRequest
import akka.http.scaladsl.Http
import akka.actor.ActorSystem

implicit val system = ActorSystem()
Source.single((HttpRequest(uri = "https://a.com"), NotUsed))
          .via(Http().superPool[NotUsed]())
          .map(_ match {
              case (Success(v), _) => {v.discardEntityBytes(); println("Success")}
              case _ => println("Failure")
          })
          .runWith(Sink.ignore)

可能是Http().superPool期望 HTTP url 并且还有其他方法可以使用 HTTPS 吗?

编辑 2:我已经打开了项目的问题:https ://github.com/akka/akka-http/issues/3138

标签: scalaakkaakka-http

解决方案


由于superPool应该已经返回Try,我会认为它错误并报告问题。至少我还没有找到说明无效请求应该终止流或返回的文档Failure

作为一种解决方法,我会尝试使用监督策略:

val decider: Supervision.Decider = {
  case _: Malformed URL Exception => Supervision.Resume // put your exception type here
  case _                          => Supervision.Stop
}

Http().superPool()
  .withAttributes(ActorAttributes.supervisionStrategy(decider))

推荐阅读