Akka Http singleRequest 流在多个请求后挂起
Akka Http singleRequest stream is hanging after multiple requests
我正在尝试请求多个 link,一次使用 akka-https Http().singleRequest
。然而,在我下面的演示代码中,foldLeft
只循环四次,应用程序永远不会到达 println
语句或终止。
我正在使用默认的 akka 配置,但我认为 Http().singleRequest
正在消耗我的线程而不是释放它们。如果我将 link 列表更改为仅包含 4 个 link,应用程序将终止并且我可以看到 println
。然而,第五个和应用程序将在第五个循环期间挂起。
有没有人以前见过这个或者我的实现有问题。此特定用例中的 ActorSystem。
val links = List(
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/"
)
implicit val as: ActorSystem = ActorSystem()
implicit val mat: ActorMaterializer = ActorMaterializer()
import as.dispatcher
def get(url: String): Future[Either[Throwable, Unit]] = {
Http().singleRequest(HttpRequest(uri = url)) transformWith {
case Success(_) =>
Future.successful(Right(()))
case Failure(e) =>
Future.successful(Left(e))
}
}
def getLinks(): Future[Seq[Unit]] = {
links.foldLeft(Future.successful(Seq.empty[Unit])){
case (f, e) => f.flatMap { ls =>
get(e) map {
case Right(i) => ls :+ i
case Left(_) => ls
}
}
}
}
getLinks() transformWith{
case Success(ls) =>
println("terminated")
println(ls.length)
Future.successful(())
case Failure(e) =>
println("terminated")
println(e.getMessage)
Future.successful(())
}
使用(或丢弃)请求的实体是强制性的(来自 https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html)。
尝试将 response.discardEntityBytes()
添加到您的代码中。
我正在尝试请求多个 link,一次使用 akka-https Http().singleRequest
。然而,在我下面的演示代码中,foldLeft
只循环四次,应用程序永远不会到达 println
语句或终止。
我正在使用默认的 akka 配置,但我认为 Http().singleRequest
正在消耗我的线程而不是释放它们。如果我将 link 列表更改为仅包含 4 个 link,应用程序将终止并且我可以看到 println
。然而,第五个和应用程序将在第五个循环期间挂起。
有没有人以前见过这个或者我的实现有问题。此特定用例中的 ActorSystem。
val links = List(
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/",
"https://www.google.com/"
)
implicit val as: ActorSystem = ActorSystem()
implicit val mat: ActorMaterializer = ActorMaterializer()
import as.dispatcher
def get(url: String): Future[Either[Throwable, Unit]] = {
Http().singleRequest(HttpRequest(uri = url)) transformWith {
case Success(_) =>
Future.successful(Right(()))
case Failure(e) =>
Future.successful(Left(e))
}
}
def getLinks(): Future[Seq[Unit]] = {
links.foldLeft(Future.successful(Seq.empty[Unit])){
case (f, e) => f.flatMap { ls =>
get(e) map {
case Right(i) => ls :+ i
case Left(_) => ls
}
}
}
}
getLinks() transformWith{
case Success(ls) =>
println("terminated")
println(ls.length)
Future.successful(())
case Failure(e) =>
println("terminated")
println(e.getMessage)
Future.successful(())
}
使用(或丢弃)请求的实体是强制性的(来自 https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html)。
尝试将 response.discardEntityBytes()
添加到您的代码中。