Scala Akka HTTP:如何使流HTTP().superpol()在遇到错误URL时不引发异常?

Scala Akka HTTP:如何使流HTTP().superpol()在遇到错误URL时不引发异常?,scala,akka,akka-http,Scala,Akka,Akka Http,我有很多URL,我想使用Akka HTTP和流获取它们 URL可能格式错误,或者DNS可能无法解析主机名。在这些情况下,我希望superpol()流只返回失败作为Try[HTTPResponse],而不是抛出异常并终止整个流 我该怎么做呢?我已经搜索过了,但是没有找到任何结果,无法找到一种方法来处理文档中的电子选项 编辑:在进一步修改之后,我发现唯一的问题是HTTPS URL,即使流没有关闭,但我在控制台上打印了错误,这是不应该发生的。下面是一个要复制的小示例: import akka.stre

我有很多URL,我想使用Akka HTTP和流获取它们

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

我该怎么做呢?我已经搜索过了,但是没有找到任何结果,无法找到一种方法来处理文档中的电子选项

编辑:在进一步修改之后,我发现唯一的问题是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:我已经打开了这个项目的一个问题:

因为<代码>超级库< /代码>应该已经返回<代码>尝试< /COD> >我会考虑它的错误和报告问题。至少我还没有找到说明invalid 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))

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

故障发送到下游是否重要,还是仅流未关闭才重要?@Mateusz流未关闭更重要,尽管将故障发送到下游会更好,但我建议将其作为问题记录在项目问题跟踪程序中,以便维护人员可以对其进行分类。尽管执行了您提到的操作,但仍会引发异常。因此,我稍微摆弄了一下URL,注意到对于使用
http://
的未知主机名,
Failure
会被发送到下游,但是使用
https://
它会将
Failure
发送到下游,但错误也会被打印出来。因此,与我之前的假设不同,流似乎没有关闭,因为即使在失败之后,接收器仍会继续接收
成功
s。我想,关键是为什么要打印错误。据我所知,错误是在任何事情都无法处理之前由
superPool
Flow
记录的。您可以将
loggerAdapter
作为superpol参数传递,以将其配置为忽略此类错误(如果需要)。