Akka HTTP:遇到不良URL时,如何使流Http()。superPool()不引发异常?

时间:2020-05-07 13:59:50

标签: scala akka akka-http

我想使用Akka HTTP和流使用许多URL。

URL可能格式错误,或者DNS可能无法解析主机名。在那种情况下,我希望superPool()流仅以Try [HTTPResponse]的形式返回Failure,而不是抛出异常并终止整个流。

我应该如何去做?我已经进行了搜索,但没有提出任何建议,找不到在文档本身中处理错误的方法。

编辑:经过多番摆弄后,我发现唯一的问题是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网址,并且还有其他使用HTTPS的方法?

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

2 个答案:

答案 0 :(得分:1)

由于superPool应该已经返回Try,因此我认为这是错误并报告问题。至少我还没有找到文档说明无效的requrest应该改为终止流或返回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))

答案 1 :(得分:0)

这是akka-http 10.1.11的问题,已在10.1.12中修复。 在后一版本中,默认情况下,HTTP和HTTPS URL均不会记录任何错误。