Akka http -ERROR:如果Payload大小增加,则子流源不能多次实现

问题描述 投票:0回答:2

我正在和Akka Http一起工作,我在那里定义了一条路线

val route = (path(HttpConstants.CreateJob) & post) {
    (entity(as[JobDetailsEntity]) & entity(as[JobEntity])) {
      (jobDetailsEntity: JobDetailsEntity, jobEntity: JobEntity) =>
        val updatedJobEntity = jobEntity.copy(runningSince = DateTime.now().getMillis)
        val updatedJobDetailsEntity = jobDetailsEntity.copy(runningSince = DateTime.now().getMillis).copy(modify_date = DateTime.now().getMillis)
        complete {
          createJobDetails(updatedJobDetailsEntity).map(_.asJson)
          createJob(updatedJobEntity).map(_.asJson)
        }
    }

在这里,我试图在同一个POST调用中解组两个entite,当我的json Payload id很小,即几个字节然后它的工作正常时,只要有效载荷大小增加,即大约10-20 kb就会抛出错误:

Substream Source cannot be materialized more than once

scala rest akka akka-http
2个回答
3
投票

请参阅https://github.com/akka/akka-http/issues/745#issuecomment-271571342

简而言之,如果您需要两次解组实体,则应首先使用toStrict以确保整个实体在内存中缓冲,否则它将在第一次解组过程中耗尽,而第二次无法使用。

只有偶然地,如果实体足够小以至于它适合akka的内部缓冲区,它就会在没有严格的情况下工作,然后实际上没有涉及耗尽。


0
投票

请注意,某些指令强制执行隐式toStrict操作,例如entity(as[String])和类似的操作。

请参阅AKKA文档:Server-Side handling of streaming HTTP Entities

© www.soinside.com 2019 - 2024. All rights reserved.