Akka Http singleRequest поток висит после нескольких запросов - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь запросить несколько ссылок, по одной, используя 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(())
}

1 Ответ

0 голосов
/ 07 декабря 2018

Использование (или отбрасывание) сущности запроса является обязательным (от https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html).

Попробуйте добавить response.discardEntityBytes() к вашему коду.

...