Сущность ответа об ошибке HTTP Akka не была подписана через 1 секунду - PullRequest
1 голос
/ 28 мая 2020

Я использую пул Akka HTTP cachedHostConnectionPoolHttps для отправки запросов как часть потока потоков Akka:

  private val requestFlow: Flow[(HttpRequest, HelperClass), Either[Error, String], _] =
Http().cachedHostConnectionPoolHttps(BaseUrl).mapAsync(1) {
  case (Success(HttpResponse(_, _, entity, _)), _) =>
    Unmarshal(entity).to[String].map(response => {
      Right(response)
    })
  case (Failure(ex), _) =>
    Future(Left(Error(ex)))
}

По какой-то причине не все ответы на запросы обрабатываются. Некоторые приводят к ошибке:

a.h.i.e.c.PoolGateway - [0 (WaitingForResponseEntitySubscription)] Response entity was not subscribed after 1 second. Make sure to read the response entity body or call `discardBytes()` on it.

Как подписаться на мой ответ, сохранив при этом поток, указанный выше?

Ответы [ 2 ]

1 голос
/ 21 августа 2020

Хотя это не лучшее решение, вы можете увеличить таймаут подписки на ответ следующим образом:

akka.http.host-connection-pool.response-entity-subscription-timeout = 10.seconds

Вот более подробное обсуждение: https://github.com/akka/akka-http/issues/1836

1 голос
/ 28 мая 2020

Как предлагается в документации, реализующая организация, выполняющая следующие действия, решает проблему:

          private val requestFlow: Flow[(HttpRequest, HelperClass), Either[Error, String], _] =
Http().cachedHostConnectionPoolHttps(BaseUrl).mapAsync(1) {
  case (Success(HttpResponse(_, _, entity, _)),    _) =>
      entity.dataBytes
        .runReduce(_ ++ _)
        .map(r => Right(r.toString))
  case (Failure(ex), _) =>
    Future(Left(Error(ex)))
}
...