Я пытаюсь запросить несколько ссылок, по одной, используя 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(())
}
0
Andreas Jarbol 7 Дек 2018 в 01:57

1 ответ

Лучший ответ

Потребление (или отклонение) объекта запроса обязательно (из https://doc.akka.io/docs/akka-http/current/implications-of-streaming-http-entity.html).

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

1
kardapoltsev 7 Дек 2018 в 00:04