Я пытаюсь запросить несколько ссылок, по одной, используя akka-https Http().singleRequest
.В моем демонстрационном коде ниже, однако, foldLeft
только когда-либо повторяется четыре раза, и приложение никогда не достигает операторов println
или завершает работу.
Я использую конфигурацию по умолчанию akka, но я думаю, что Http().singleRequest
потребляет мои темы и не выпускает их.Если я изменю список ссылок только на 4 ссылки, приложение завершит работу, и я смогу увидеть 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(())
}