我有很多URL,我想用Akka HTTP,用流来获取。
这些URL可能是形式不良的,或者DNS可能无法解析主机名。在这些情况下,我想让superPool()流简单地返回一个Failure作为Try[HTTPResponse],而不是抛出一个异常并终止整个流。
我应该如何去做呢?我找过了,但一无所获,在文档本身找不到处理esception的方法。
EDIT:再摆弄了一下,我发现唯一的问题是HTTPS urls,即使这样,流也没有关闭,但我在控制台上打印出了不应该发生的错误。下面是一个小例子来重现。
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 urls,有什么其他方法可以和HTTPS一起工作?
EDIT 2:我已经开了一个项目的问题。https:/github.comakkaakka-httpissues3138。
自 superPool
应已返回 Try
我会认为这是错误并报告问题。至少我还没有找到文档说无效的request应该终止流,而不是返回 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))
这是akka-http 10.1.11的一个问题,已经在10.1.12中得到了修复。在后一个版本中,默认情况下,HTTP和HTTPS urls都不会被记录错误。