Akka HTTP:如何让流Http().superPool()在遇到坏的URL时不抛出异常?

问题描述 投票:0回答:1

我有很多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。

scala akka akka-http
1个回答
1
投票

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))

0
投票

这是akka-http 10.1.11的一个问题,已经在10.1.12中得到了修复。在后一个版本中,默认情况下,HTTP和HTTPS urls都不会被记录错误。

© www.soinside.com 2019 - 2024. All rights reserved.