akka-http HttpEntity.toStrict истекло время ожидания при ожидании ожидающих данных - PullRequest
1 голос
/ 24 февраля 2020

Я случайно сталкиваюсь с проблемой без SSL (иногда это работает без проблем) и каждый раз с SSL, и я не понимаю, почему. Это время ожидания во время HttpEntity.toStrict.

extractRequest{payload =>

              val futureRequestEntity = payload.entity.toStrict(5.seconds).map(_.data.utf8String)
              val requestEntity = Await.result(futureRequestEntity, 10.seconds)

... }

Я пытался установить более длительное время ожидания, но не решил проблему.

java.util.concurrent.TimeoutException: HttpEntity.toStrict timed out after 5 seconds while still waiting for outstanding data
at akka.http.impl.util.ToStrict$$anon$1.onTimer(package.scala:138)

Мне нужно использовать extractRequest для моего пути, потому что я извлекаю сущность и заголовок далее в коде.

Код маршрута:

            options {
          corsHandler.corsHandler(complete(StatusCodes.OK))
        } ~ post {
          path("recommandation" / Segment / Segment / "suggestion") {(docType,docId) =>
            extractRequest{payload =>
              writeLog("info",s"/recommandation : Post request for $docType suggestion : $docId ")
              val coBranding = payload.headers.filter(x => x.is("cobrandingcontext")).map(x => x.value()).head
              val futureRequestEntity = payload.entity.toStrict(5.seconds).map(_.data.utf8String)
              val requestEntity = Await.result(futureRequestEntity, 10.seconds)

              val parsedPayload = suggestionEngine.payloadParser.suggestionEnginePayloadParser(requestEntity,
                coBranding,docType, docId)
              if (parsedPayload.isDefined){
                val suggestionResult = suggestionEngine.suggestionWorker.suggestionPipeline(parsedPayload.get)
                val suggestionResponse = suggestionEngine.responseHandler.responseBuilder(suggestionResult).get
                complete(200,List(`Content-Type`(`application/json`)),suggestionResponse)

              } else {
                writeLog("error","/recommandation : undefined payload")
                complete(StatusCodes.BadRequest,List(`Content-Type`(`application/json`)),"Undefined payload")
              }
            }
          }
        }

Пример запроса:

    curl -i https://mydns.com:443/recommandation/products/59ad73be20a35d3fa47c80c8/suggestion -H 
  'cobrandingcontext: branding' -H 'Content-Type: application/json;charset=UTF-8' -X POST -d '{"collection":"products",
  "query":{"category_parent":"category-ex","category_child":"category-child-ex","dimensions.width":{"$lt":70,"$gt":0},
  "dimensions":{"$lt":40,"$gt":-40},"status":true,"structured":true,"visibilities":"architects-3d-btoc"},"configuration":{"type":"nearest-neighbors","metric":"cosine","features":["styles"]}}'

Заранее благодарен

1 Ответ

0 голосов
/ 27 февраля 2020

Я думаю, что объяснение состоит в том, что использование Await заблокирует поток диспетчера, что может привести к истощению потока. Решение, которое я нашел, заключается во вложении директив:

                options {
              corsHandler.corsHandler(complete(StatusCodes.OK))
            } ~ post {
              path("/"){
                entity(as[String]){payload =>
                  headerValueByName("context"){ contextValue => {
...// work with payload and contextValue

                   }
                  }
                }
              }
            }
...