我想使用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
答案 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均不会记录任何错误。