scala - Akka HTTP:当遇到错误的 URL 时,如何让流 Http().superPool() 不抛出异常?
问题描述
我有很多我想使用 Akka HTTP 和使用流的 URL。
URL 可能格式错误,或者 DNS 可能无法解析主机名。在这些情况下,我希望 superPool() 流简单地返回一个失败作为 Try[HTTPResponse] 而不是抛出异常并终止整个流。
我该怎么做呢?我已经搜索过了,但什么也没找到,找不到处理文档本身中的 esceptions 的方法。
编辑:再摆弄一点之后,我发现唯一的问题是 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:我已经打开了项目的问题:https ://github.com/akka/akka-http/issues/3138
解决方案
由于superPool
应该已经返回Try
,我会认为它错误并报告问题。至少我还没有找到说明无效请求应该终止流或返回的文档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))
推荐阅读
- javascript - 移至 monorepo 后重新设置分支
- python-3.x - 如何从具有多个 groupby 列的 OHLC 数据中计算枢轴值
- r - 轴的ggplot`expand_scale()` - 不一致
- css - Jupyter 笔记本幻灯片 - 去除侧面的空白
- apache-kafka - 获取相关 ID 为 1 的元数据时出错:kafka 中的 {test1=LEADER_NOT_AVAILABLE}
- node.js - 如何使用 WSO2 EI 集成服务并为使用 MERN 堆栈构建的 Web 应用程序提供 REST API?
- javascript - 表示会话未在中间件中定义,但在控制器中定义
- javascript - 根据剩余时间更改班级
- python - 有没有办法在 Selenium 的浏览器 URL 中输入字符?
- javascript - Google 爬虫能否读取延迟脚本在页面加载后插入的 JSON-LD?