akka-http HttpEntity.toStrict在等待未完成的数据时超时

oiopk7p5  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(129)

我在没有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"]}}'

先谢谢

gdx19jrr

gdx19jrr1#

我认为原因是使用Await会阻塞一个调度器线程,这会导致线程饥饿。我找到的解决方案是嵌套指令:

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

                   }
                  }
                }
              }
            }

相关问题